您的位置:首页 > 编程语言 > C语言/C++

单链表的C++实现

2017-08-25 16:47 197 查看
以下是数据结构中单链表的C++实现,如有需要,请访问我的Github获取完整源码。

//Node类的定义
class Node
{
public:
int data;
Node *next;              //指向下一个元素
void printNode();

//没有构造函数,使用默认构造函数
};

//Node类成员函数的实现
#include"Node.h"
#include <iostream>
using namespace std;

void Node::printNode()
{
cout << data <<endl;
}

//List类的定义
#include"Node.h"

class List
{
public:
List();                                    //构造函数
~List();                                   //析构函数
void ClearList();                          //清空链表
bool ListEmpty();                          //链表判空
int ListLength();                          //链表长度
bool GetElem(int i, Node *pNode);          //获取第i个元素,存入结点pNode
int LocateElem(Node *pNode);               //获取数据域和结点pNode相等的结点
bool PriorElem(Node *currentNode, Node *preNode); //前驱
bool NextElem(Node *currentNode, Node *nextNode); //后继
void ListTraverse();                              //遍历链表
bool ListInsertHead(Node *pNode);                 //插入元素到头结点之后
bool ListInsertTail(Node *pNode);                 //插入元素到尾节点之后
bool ListInsert(int i, Node *pNode);              //插入元素到第i个位置
bool ListDelete(int i, Node *pNode);              //删除第i个位置的元素

private:
Node *m_pList;
int m_iLength;
};

//List类中成员函数的实现
#include"List.h"
#include <iostream>
using namespace std;
//#include"Node.h"

/************************************************************************/
/*List类各成员函数的实现*/

List::List()
{
//申请一个空间存放结点
m_pList = new Node;
m_pList->data = 0;
m_pList->next = NULL;
m_iLength = 0;
}

//清空链表
void List::ClearList()
{
//将当前结点指向头结点的next
Node *currentNode = m_pList->next;
//如果当前结点不为空,就删除,直到当前结点为空
while(currentNode != NULL)
{
Node *temp = currentNode->next;
delete currentNode;
currentNode = temp;
}
//将头结点的next置为空
m_pList->next = NULL;
}

List::~List()
{
//先清空链表,只剩下头结点
ClearList();
//删除头结点,释放内存
delete m_pList;
m_pList = NULL;
}

//判断链表是否为空:只需判断链表的当前长度m_iLength是否为0
bool Lis
cdc7
t::ListEmpty()
{
if(m_iLength == 0)
{
return true;
}
else
{
return false;
}
}

//获取链表的当前长度:直接返回当前长度m_iLength
int List::ListLength()
{
return m_iLength;
}

//插入结点到头结点之后
bool List::ListInsertHead(Node *pNode)
{
Node *temp = m_pList->next;
Node *newNode = new Node;
if(newNode == NULL)
{
return false;
}
//先处理数据域
newNode->data = pNode->data;
//再处理前面的结点
m_pList->next = newNode;
//最后处理自己的指针
newNode->next = temp;
//链表长度增加1
m_iLength++;
return true;
}

//插入结点到尾节点之后
bool List::ListInsertTail(Node *pNode)
{
//遍历链表找到最后一个结点
Node *currentNode = m_pList;
while(currentNode->next != NULL)
{
currentNode = currentNode->next;
}
//为插入的结点申请空间
Node *newNode = new Node;
if(newNode == NULL)
{
return false;
}
//先处理数据域
newNode->data = pNode->data;
//再处理自己的指针
newNode->next = NULL;
//最后处理前面的结点
currentNode->next = newNode;
//链表长度增加1
m_iLength++;
return true;
}

//在第i个位置插入结点
bool List::ListInsert(int i, Node *pNode)
{
if(i < 0 || i > m_iLength)
{
return false;
}
Node *newNode = new Node;
if(newNode == NULL)
{
return false;
}
//遍历找到第i个结点
Node *currentNode = m_pList;
for(int k = 0; k < i; k++)
{
currentNode = currentNode->next;
}

//先处理数据域
newNode->data = pNode->data;
//再处理自己的指针
newNode->next = currentNode->next;
//最后处理前面的结点
currentNode->next = newNode;
//链表长度增加1
m_iLength++;
return true;
}

bool List::ListDelete(int i,Node *pNode)
{
if(i < 0 || i >= m_iLength)
{
return false;
}
//遍历找到第i个结点和前一个结点
Node *currentNode = m_pList;
Node *currentNodeBefore = NULL;
for(int k = 0; k <= i; k++)
{
currentNodeBefore = currentNode;
currentNode = currentNode->next;
}

//先处理数据域
pNode->data = currentNode->data;
//再处理自己的指针删除
currentNodeBefore->next = currentNode->next;
//删除结点
delete currentNode;
currentNode = NULL;
//链表长度减1
m_iLength--;
return true;
}

//获取第i个结点的值复制给pNode
bool List::GetElem(int i, Node *pNode)
{
if(i < 0 || i >= m_iLength)
{
return false;
}
//遍历找到第i个结点
Node *currentNode = m_pList;
//Node *currentNodeBefore = NULL;
for(int k = 0; k <= i; k++)
{
//currentNodeBefore = currentNode;
currentNode = currentNode->next;
}
pNode->data = currentNode->data;
return true;
}

//返回第一个值等于pNode的值的位置
//在链表中,头结点不是位置为0的结点,头结点的下一个结点才是
int List::LocateElem(Node *pNode)
{
//找到头结点
Node *currentNode = m_pList;
//保存位置的变量
int count = 0;
//遍历链表找到值
while(currentNode->next != NULL)
{
currentNode = currentNode->next;
if(currentNode->data == pNode->data)
{
return count;
}
count++;
}
//若未找到,返回-1
return -1;
}

//寻找currentNode结点的前驱
bool List::PriorElem(Node *currentNode, Node *preNode)
{
//获取头结点
Node *currentNodeNew = m_pList;
//定义当前结点的前一个结点
Node *currentNodeBefore = NULL;

//遍历链表
while(currentNodeNew->next != NULL)
{
currentNodeBefore = currentNodeNew;
currentNodeNew = currentNodeNew->next;
//若找到当前结点currentNode
if(currentNode->data == currentNodeNew->data)
{
//若当前结点的前驱为头结点,返回false
if(currentNodeBefore == m_pList)
{
return false;
}
//将前驱的值给preNode的数据域
preNode->data = currentNodeBefore->data;
return true;
}
}
return false;
}

//寻找currentNode的后继
bool List::NextElem(Node *currentNode, Node *nextNode)
{
//获取头结点
Node *currentNodeNew = m_pList;
//遍历链表
while(currentNodeNew->next != NULL)
{
currentNodeNew = currentNodeNew->next;
if(currentNodeNew->data == currentNode->data)
{
if(currentNodeNew->next == NULL)
{
return false;
}
//将找到的结点的next的值赋值给nextNode的数据域
nextNode->data = currentNodeNew->next->data;
return true;
}
}
return false;
}

//遍历链表
void List::ListTraverse()
{
Node *currentNode = m_pList;
while(currentNode->next != NULL)
{
currentNode = currentNode->next;
currentNode->printNode();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: