链表
单链表的定义和表示
结点:存储本身的信息以及存储一个指示其直接后继的信息
数据域:存储数据元素的域
指针域:存储直接后继的存储位置
单链表的相关操作
#include<cstdio> #include<iostream> using namespace std; typedef int ElemType; //单链表的存储结构 typedef struct LNode{ ElemType data; //结点的数据域 struct LNode *next; //结点的指针域 }LNode,*LinkList; //LinkList为指向结构体LNode的指针类型 LNode *p; int j; //单链表基本操作的实现 //1 初始化 void initList(LinkList &L){ //构造一个空的单链表 L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 L->next=NULL; //头结点的指针域置空 } //2 取值 用e返回L中第i个数据元素的值 void GetElem(LinkList L,int i,ElemType &e){ p=L->next;j=1; //初始化,P指向首元结点 while(p&&j<i){ //直到p为空或p指向第i个元素 p=p->next; ++j; } if(!p||j>i){ perror("ERROR"); } e=p->data; } //3 查找 在带头结点单链表L中查找值为e的元素 LNode *LocateElem(LinkList L,ElemType e){ p=L->next; //初始化,p指向首元结点 while(p && p->data!=e){ p=p->next; } return p; //查找成功返回值为e的结点地址p,查找失败p为NULL } //4 插入 将值为e的新结点插入到表的第i个结点的位置上 void ListInsert(LinkList &L,int i,ElemType e){ p=L;j=0; while(p && (j<i-1)){ p=p->next; ++j; } if(!p || j>i-1){ perror("error"); } LNode *s=new LNode; //生成新结点*s s->data=e; //*s赋值 s->next=p->next; //*s的指针域指向第i+1个结点 p->next=s; //将结点*p的指针域指向结点*s } //5 删除 void ListDelete(LinkList &L,int i){ p=L;j=0; //要找到前删除前的那个结点的位置 while((p->next) && (j<i-1)){ p=p->next; ++j; } if(!(p->next)||(j>i-1)) perror("error");//当i>n或i<1时,删除位置不合理 LNode *q=p->next; //临时保存被删结点的地址以备释放 p->next=q->next; delete q; //释放空间 } //6 创建单链表 前插法 类似于插入的元素是从后往前的 void CreateList_H(LinkList &L,int n){ //L=new LNode; //L->next=NULL; //先建立一个带头结点的空链表 initList(L); for(int i=0;i<n;i++){ p=new LNode; //生成新的结点*p cin>>p->data; //输入元素赋值给*p的数据域 p->next=L->next; L->next=p; } } //7 创建单链表 后插法 插入的元素是从前往后的 void CreateList_R(LinkList &L,int n){ initList(L); //初始化 LNode *r=L; for(int i=0;i<n;i++){ p=new LNode; //生成新结点 cin>>p->data; p->next=NULL; r->next=p; r=p; } } //8 遍历链表 void showList(LinkList L){ p=L->next; while(p){ cout<<p->data<<" "; p=p->next; } } int main(){ LinkList L; int n=6; //头插法 逆序 CreateList_H(L,n); showList(L); //尾插法 顺序 CreateList_R(L,n); showList(L); }
Q&A
首元结点、头结点、头指针
首元结点是指链表中存储的第一个数据元素的结点。
头结点是在首元结点之前附设的一个结点,其指针域指向首元结点。头结点的数据域可以不存储任何信息,也可以存储与数据元素类型相同的其他附加信息。
头指针是指向链表中第一个结点的指针。若链表设有头结点,则头指针所指向的结点就为头结点,反之,指向的就是首元结点。
链表增加头结点的作用
- 便于首元结点的处理
- 便于空表和非空表的统一处理