1.单链表的存储结构定义
单链表:由n个结点链接成的,结点由数据域和指针域两部分组成,指针指向链表的下一个结点。头指针:我们把链表中的第一个结点的存储位置,整个链表的存取就必须是从头指针开始进行了。同时,我们规定链表的最后一个结点的指针域为NULL。
头结点:有时为了操作方便,会在单链表的第一个结点前附设一个结点,该节点就是头结点。头结点的数据域可以不存储任何信息,也可存储如线性表长度等附加信息,头结点的指针域指向第一个结点的指针。
2.头指针和头结点的连续
头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。具有标识作用,所以常用头指针来表示链表的名字。无论链表是否为空,头指针均不为空。头指针是链表的必要元素。头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义。有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其他结点的操作就统一了。头结点不是链表的必要元素。
3.单链表的基本操作
存储结构的定义和函数的声明
//线性表的单链表存储结构
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
//创建一个结点
ListNode* CreateListNode(int value);
//连接结点
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);
//尾部插入一个结点
void AddToTail(ListNode** pHead,int value);
//删除一个结点
void RemoveNode(ListNode** pHead,int value);
//打印结点
void PrintListNode(ListNode* pNode);
//打印链表
void PrintList(ListNode* pHead);
//销毁链表
void DestroyList(ListNode* pHead);
函数的定义
#include<iostream.h>
#include<stdlib.h>
#include"List.h"
//创建一个结点
ListNode* CreateListNode(int value)
{
ListNode* pNode=new ListNode();
if(pNode==NULL)
{
cout<<"创建结点失败!"<<endl;
return NULL;
}
pNode->m_nValue=value;
pNode->m_pNext=NULL;
return pNode;
}
//连接结点
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext)
{
if(pCurrent==NULL)
{
cout<<"当前结点不存在!"<<endl;
return;
}
pCurrent->m_pNext=pNext;
}
//尾部插入节点
void AddToTail(ListNode** pHead,int value)
{
if(pHead==NULL)
return;
ListNode* pNew=new ListNode();
pNew->m_nValue=value;
pNew->m_pNext=NULL;
if(*pHead==NULL)
*pHead=pNew;
else
{
ListNode* pNode=*pHead;
while(pNode->m_pNext!=NULL)
pNode=pNode->m_pNext;
pNode->m_pNext=pNew;
}
}
//删除一个结点
void RemoveNode(ListNode** pHead,int value)
{
if(pHead==NULL||*pHead==NULL)
return;
if((*pHead)->m_pNext==NULL&&(*pHead)->m_nValue==value)//一个结点
{
delete (*pHead);
*pHead=NULL;
return;
}
ListNode* pToBeDeleted;
ListNode* pNode=*pHead;
while(pNode->m_pNext->m_pNext!=NULL)
{
if(pNode->m_pNext->m_nValue!=value)
pNode=pNode->m_pNext;
else
{
pToBeDeleted=pNode->m_pNext;
pNode->m_pNext=pNode->m_pNext->m_pNext;
delete pToBeDeleted;
pToBeDeleted=NULL;
return;
}
}
}
//打印结点
void PrintListNode(ListNode* pNode)
{
if(pNode == NULL)
{
cout<<"结点为空!"<<endl;
}
else
{
cout<<"结点值为:"<< pNode->m_nValue<<endl;
}
}
//打印链表
void PrintList(ListNode* pHead)
{
cout<<"开始打印链表"<<endl;
ListNode* pNode = pHead;
while(pNode != NULL)
{
cout<<pNode->m_nValue<<" ";
pNode = pNode->m_pNext;
}
cout<<"打印链表结束"<<endl;
}
//销毁链表
void DestroyList(ListNode* pHead)
{
if(pHead==NULL)
return;
ListNode* pCur=pHead;
while(pCur!=NULL)
{
pHead=pHead->m_pNext;
delete pCur;
pCur=pHead;
}
}
这些代码是我也是参考了很多资料的,如有问题大家可以发评论,我们共同交流。