所谓单链表即为一条链,一个结点连接着下一个结点,每一个结点都含有数据域和指针域,数据域存放数据信息,指针域存放下一结点的地址信息。
如图,第一个结点ZHAO的存储地址为61,指针域为13,即下一结点是QIAN,依次往下,WANG为最后一个结点指针域为NULL即为空。
typedef struct LNode{
ElemType data;//数据域
struct Lnode *next;//指针域
}LNode,*LinkList;
1.初始化
Status InitList(LinkList &L){
//构造一个空的单链表L
L= new LNode;//生成新节点作为头结点,用指针L指向头结点
L->next=NULL;//头结点的指针域置空;
return OK;
}
2.取值
Status GerElem(LinkList L,int i,ElemType &e){
//找到第i个元素的值,用e返回改元素的值
p= L->next;int j=1;//初始化,p指向首元结点,计数器j初值为1
while(p&&j<i){
p=p->next;//指针p指向下一个结点
j++;//计数器j++
}
if(!p||j>i) return ERROR;//指针p为空或者i值不合法
e=p->data;//取第i个结点的数据域
return Ok;
}
3.查找
Status LocateElem(LinkList L,ElemType &e){
//在L中查询e所在的第一个位置
p= L->next;int j=1;
while(p && p->data != e){
p=p->data;
j++;
}
if(!p) return ERROR;//若p为空,查询失败
return j;//p非空返回查询到的位置
}
4.插入
Status ListInsert(LinkList &L,int i,EeemType e){
//在第i个位置插入一个结点
p=L;j=0;
while(p && j<i-1){
//使p指向第i-1个元素
p=p->next ;j++
}
if(!p||j>i-1) return ERROR;
s=new NLode;
s->data=e;
s->next=p->next;//让*s的指针域指向ai
p->next=s;//让*p的指针域指向s;
return OK;
}
5.删除
Status ListDelete(LinkList &L,int i){
//删除第i个位置的结点
p=L;j=0;
while((p->next) && j<i-1){
p=p->next;j++;
}
if(!(p->next)|| j>i+1) return ERROR;
q=p->next;
p->next=q->next;
delete q;
return OK;
}
6.创建单链表
void CreateList_H(LinkList &L,int n){
//前插法
L=new NLode;
L->next =NULL;
for(int i=0;i<n;i++){
p=new LNode;
cin>>p->data ;
p->next=L->next;L->next=p;
}
}
void CreateList_R(LinkList &L,int n){
//后插法
L=new NLode;
L->next =NULL;
r=L;
for(int i=0;i<n;i++){
p=new LNode;
cin>>p->data;
p->next=NULL;r->next=p;
r=p;
若想记录结点的数量可以用L->data记录即使用头结点记录元素数量。
循环链表与单链表唯一不同就是循环链表最后一个结点的指针域指向首元结点。
判别条件由p!=NULL||p->next!=NULL变为p!=L||p->next!=L。
所谓双向链表就是一个结点存储前后两个结点的地址信息。
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior; //指向前驱
streuc DuLNode *next; //指向后驱
}DuLNode,*DuLNodeList;
插入
Status ListInsert_DuL(LinkList &L,int i,ElemType e){
if(!(p=GetElem_DuL(L,i)))
return ERROR;
s=new DuLNODE;
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return OK;
}
删除
Status ListDelete_DuL(LinkList &L,int i){
if(!(p=GetElem_DuL(L,i)))
return ERROR;
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
return OK;
}
参考书籍《数据结构》严蔚敏版