顺序表之链接表示
概念:链接表示是实现线性表的另一种经常使用的存储结构。这种存储结构不要求逻辑关系上相邻的两个元素在物理位置上也相邻存储,而是通过增加指针来表示元素之间的逻辑关系和后继元素的位置。
1. 单链表表示
单链表中的每个结点包括两个域:数据域(info)——存放元素本身的信息;
指针域(link)——存放后续结点的存储位置。
最后一个元素没有后继,它的指针不指向任何结点,成为空指针。^ NULL
每个结点只有一个指针域的链表叫单链表,指向链表中第一个结点的指针称为该链表的头指针。
做以下定义:
struct Node; //单链表的结点类型;
typedef struct Node * PNode ; //指向结点的指针类型;
struct Node{ //单链表结点结构
DataType info;
PNode link;
};
typedef struct Node * LinkList
假设llist是某单链表的头指针
加一个头结点会使得对单链表中的第一个结点进行处理时方便很多,具体内容下面会有提及。
2.单链表上运算的实现
1.创建空链表
LinkList createNullList_link(void){
LinkList llist =(LinkList)malloc(sizeof(struct Node));
if(llist!=NULL) llist->link;
else printf("Out of space!\n");
return llist;
}
2.判断单链表是否为空(带头结点)
因为llist总是指向头结点,所以要对llist->link 进行判断。
int isNullList_link(LinkList llist)
{
return (llist->link==NULL);
}
3.在单链表中求某元素的存储位置
PNode locate_link(LinkList llist , DataType x){
//带有头结点
PNode p;
if(llist==NULL) return NULL;
p=llist->link;
while(p!=NULL&&p->info!=x) p=p->link;
return p;
}
4.单链表的插入
这是在结点p的后面插入结点q (单链表带头结点)
int insertPost_link(LinkList llist,PNode p,DataType x){
PNode q=(PNode)malloc(sizeof(struct Node));
if(q==NULL) return NULL;
else {q->info=x; q->link=p->link; p->link=q; return 1;}
}
注意这两句话的顺序 q->link=p->link; p->link=q;
当 要求在结点之前插入数据x时,需要先找到此结点的前驱结点
PNode locatePre_link(LinkList llist , PNode p){
PNode p1;
if(llist==NULL) return NULL;
p1=llist;
while(p1!=NULL&&p1->link!=p)
{p1=p1->link;
return p1;}
}
接着对p1用上面的insertPost算法
5.单链表的删除
int deleteV_link(LinkList llist,DataType x){
//删除值为x的结点
PNode p,q;
p=llist;
if(p==NULL) return 0;
while(p->link!=NULL&&p->link->info!=x) p=p->link;
if(p->link ==NULL) return 0; //全都遍历完 都没有找到x
else{
q=p->link;
q->link=p->link;
free(q);
return 1;
}
如果要删除指针p所指向的结点,则先要找到它的前驱结点,然后再进行删除操作。
3.单链表的改进和扩充
循环链表
图b更常用,因为让clist指向最后一个结点,这样无论是找以第一个结点还是最后一个结点都很方便。
双链表 、循环双链表等就不细说了。
来源:CSDN
作者:菜菜的球
链接:https://blog.csdn.net/qq_43540763/article/details/104779255