以下为LinkList.h文件代码
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *pLinkList;
class LinkList
{
private:
pLinkList pList;
int listLength;
public:
LinkList();
~LinkList();
bool InitList();
bool DestroyList();
bool ClearList();
bool IsEmpty();
int GetLength();
bool GetNode(int position, LNode** node);
int LocateElem(int elem);
bool SetNodeData(int position, int newData);
bool GetNodeData(int position, int &data);
bool InsertNode(int beforeWhich, int data);
/*bool DeleteNode(int position);*/
bool DeleteNode(int data);
};
#endif // LINKLIST_H_INCLUDED
以下为LinkList.cpp文件代码
#include <iostream>
#include "LinkList.h"
LinkList::LinkList()
{
pList = NULL;
listLength = 0;
InitList();
}
LinkList::~LinkList()
{
if (!DestroyList())
{
DestroyList();
}
}
//初始化,分配一个头节点。
bool LinkList::InitList()
{
if (!(pList = new LNode))
{
return false;
}
pList->next = NULL;
return true;
}
//销毁链表。
bool LinkList::DestroyList()
{
if (!ClearList()) {
return false;
}
delete pList;
return true;
}
//判断链表是否为空。若为空,返回true,否则返回false。
bool LinkList::IsEmpty() {
if (pList->next == NULL)
{
return true;
}
return false;
}
//返回链表的中当前节点数。
int LinkList::GetLength()
{
return listLength;
}
//将链表清空,释放当前所有节点。
bool LinkList::ClearList()
{
if (pList == NULL)
{
return false;
}
LNode *pTemp = NULL;
while (pList->next != NULL)
{
pTemp = pList->next;
pList->next = pTemp->next;
delete pTemp;
}
listLength = 0;
return true;
}
//将position指定的节点内的数据设置为newData。
//第一个有效节点的position为1。
bool LinkList::SetNodeData(int position, int newData)
{
LNode *pTemp = NULL;
if (!(GetNode(position, &pTemp)))
{
return false;
}
pTemp->data = newData;
return true;
}
//得到指定位置节点的数据。
//节点索引从1到listLength。
bool LinkList::GetNodeData(int position, int &data)
{
LNode *pTemp = NULL;
if (!(GetNode(position, &pTemp)))
{
return false;
}
data = pTemp->data;
return true;
}
//在链表中插入一个节点。
//插入的位置由beforeWhich指定,新节点插入在beforeWhich之前。
//beforeWhich的取值在1到ListLength+1之间。
bool LinkList::InsertNode(int beforeWhich, int data)
{
LNode *pTemp = NULL;
if (beforeWhich < 1 || beforeWhich > (listLength + 1))
{
return false;
}
if (!(GetNode(beforeWhich - 1, &pTemp)))
{
return false;
}
LNode *newNode = new LNode;
newNode->data = data;
newNode->next = pTemp->next;
pTemp->next = newNode;
listLength++;
return true;
}
//删除一个指定的节点。
//节点位置由position指定。
//positon的值从1到listLength。
//若链表为空或指定的节点不存在则返回false。
/*
bool LinkList::DeleteNode(int position)
{
if (position < 1 || position > listLength)
{
return false;
}
LNode *pTemp = NULL;
if (!(GetNode(position - 1, &pTemp)))
{
return false;
}
LNode *pDel = NULL;
pDel = pTemp->next;
pTemp->next = pDel->next;
delete pDel;
listLength--;
return true;
}*/
//通过指定data删除节点
bool LinkList::DeleteNode(int data)
{
LNode *pTemp = NULL;
pTemp = pList;
while (1)
{
if (pTemp->next->data == data)
{
break;
}
pTemp = pTemp->next;
}
LNode *pDel = NULL;
pDel = pTemp->next;
pTemp->next = pDel->next;
delete pDel;
listLength--;
return true;
}
//得到指定位置节点的指针。
bool LinkList::GetNode(int position, LNode **node)
{
LNode *pTemp = NULL;
int curPos = -1;
pTemp = pList;
while (pTemp != NULL)
{
curPos++;
if (curPos == position)
break;
pTemp = pTemp->next;
}
if (curPos != position)
{
return false;
}
*node = pTemp;
return true;
}
//定位与指定数据相等的数据节点。
//如果在当前链表中已经存在该数据则返回该数据节点的索引号。
//若不存在这样的节点则返回0。
//节点索引从0开始到listLength。
int LinkList::LocateElem(int elem)
{
LNode *pTemp = NULL;
int curIndex = 1;
pTemp = pList->next;
while ((pTemp != NULL) && (pTemp->data != elem))
{
pTemp = pTemp->next;
curIndex++;
}
if (pTemp == NULL)
{
return 0;
}
return curIndex;
}
分享到:
相关推荐
学习尝试,代码不完美,请多包涵
总的来说,C++中的链表实现涉及到对数据结构和对象的理解,以及熟练运用指针和动态内存管理。通过这个实践,你可以更好地掌握C++的面向对象编程,并深入理解链表这一重要数据结构。如果有任何问题或遇到运行错误,...
定义结构体类型,使用动态链表结构编程实现学生 管理系统如下功能: (1)录入每个学生的基本信息; (2)计算每个学生的平均分; (3)按平均分从高到低输出学生信息; (4)按学生姓名的字典顺序输出学生基本信息; (5)按...
以下是一个简单的双向链表类实现: ```cpp class DoublyLinkedList { private: Node* head; Node* tail; public: DoublyLinkedList() : head(nullptr), tail(nullptr) {} // 插入节点到链表尾部 void append...
本实验将详细介绍如何用C++通过链表实现插入、删除和排序操作。 ### 1. 链表基础知识 链表由节点组成,每个节点包含两部分:数据域和指针域。数据域存储实际的数据,而指针域则指向下一个节点。链表的头节点通常...
C++进阶学习——单向链表的实现,相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/49685199
**C++的双向链表实现** 在C++中,双向链表是一种数据结构,它包含节点,每个节点都有指向其前一个节点和后一个节点的指针。这使得在链表中的导航比单链表更加灵活,因为可以向前或向后移动。双向链表在许多算法和...
`operator*`方法实现多项式乘法,通常采用Karatsuba算法或Toom-Cook算法等高效策略,但基础版本可以使用简单的乘法规则:对每一个项A[i]在第一个多项式中,遍历第二个多项式的所有项B[j],计算A[i]*B[j],并将结果...
本项目“C++实现的一个简单链表”聚焦于使用C++语言来创建和操作单链表。下面我们将深入探讨单链表的概念、C++中的实现方式以及其在实际编程中的应用。 单链表是一种线性数据结构,其中每个元素(称为节点)包含两...
在C++编程中,我们可以使用链表数据结构来有效地实现一元多项式的操作,这是因为链表允许动态地存储和管理元素,非常适合处理具有未知长度的多项式序列。 首先,我们需要创建一个节点结构来表示多项式的每个项。这...
总的来说,用链表实现多项式运算是一种灵活且高效的方法,它可以方便地处理任意大小的多项式,并支持各种算术操作。链表的动态特性使得这种实现方式具有很高的可扩展性,可以适应不同的问题需求。
下面是一个简单的链表实现的C++栈模版示例: ```cpp #include struct Node { int data; Node* next; }; class Stack { private: Node* top; public: Stack() : top(NULL) {} ~Stack(); void push(int ...
总结一下,C++中的链表实现涉及创建节点、插入、删除和遍历等操作。而链表的合并则需要对两个有序链表进行比较并构造新的有序链表。在实际编程中,理解和掌握这些基本操作对于解决更复杂的问题至关重要。在`MyChain`...
本文将深入探讨如何使用C++通过链表数据结构实现多项式加法。链表是一种非连续、非顺序的存储结构,每个节点包含数据元素以及指向下一个节点的指针。在这种情况下,我们将创建一个链表节点来表示多项式的项,其中...
根据给定文件的信息,我们可以总结出以下关于C++中链表队列实现的相关知识点: ### 一、链表队列的基本概念 链表队列是一种使用链表结构来实现的队列数据结构。队列是一种先进先出(First In First Out, FIFO)的...
在本项目中,“用链表实现的职工管理软件 ( C++ )”,我们主要探讨的是如何使用C++编程语言,特别是利用链表数据结构来设计一个简单的职工管理系统。链表是一种非常基础且重要的数据结构,它在内存中并不连续存储...
这就是一个简单的C++链表实现。通过这个实现,你可以学习到如何定义节点,如何使用指针链接节点,以及如何通过类封装这些操作。链表在实际编程中有着广泛的应用,比如在实现栈、队列、哈希表等数据结构时都会用到。...
一个简单的双向链表节点定义可能如下: ```cpp struct Node { int data; Node* next; Node* prev; }; ``` 在这里,`data`用于存储数据,`next`指针指向后继节点,`prev`指针指向前驱节点。初始化链表时,通常会...
根据给定的信息,本文将详细解释如何在C++中利用链表实现一个基本的通讯录系统,包括添加、查找和删除联系人等核心功能。 ### 一、项目概述 本项目是一个基于C++语言实现的控制台应用程序,其主要目的是通过链表...
此外,我们还经常需要遍历链表以打印或检查其内容,这可以通过一个简单的循环实现: ```cpp void printList(ListNode* head) { ListNode* curr = head; while (curr != NULL) { std::cout << curr->data ; curr...