不带头结点的单链表(链式存储)
不要求逻辑上相邻的两个数据元素逻辑上也相邻,他们是通过"链",建立起数据元素之间的逻辑关系。因此对线性表的插入、删除不需要移动数据元素,只需要修改"链"。
例如:画出26个字母的链式存储结构
逻辑结构:(a,b,c,…,x,y,z)
链式存储结构:
结点由两个域组成:
数据域:存储元素数值数据
指针域:存储直接后继结点的存储位置
与链式存储有关的术语
- 结点:数据元素的存储映像。由数值域和指针域两部分组成。
- 链表:n个结点由链指针组成一个链表。他是线性表的链式存储映像,称为线性表的链式存储结构。
- 单链表:结点只有一个指针域的链表。
- 双链表:有两个指针域的链表。
- 循环链表:首尾相接的链表。
- 头指针、首元结点
头指针:指向链表中第一个结点的指针。
首元结点:链表中存储第一个数据元素a1的结点。
空表
非空表
单链表是由表头唯一确定,因此单链表可以用头指针的名字来命名。若头指针是head,则把链表称之为表head。
- 建立一个空的单链表:
node *init()
{
return NULL;
}
- 遍历操作
工作指针后移,从首结点出发,通过工作指针的反复后移而将整个单链表"审视"一次的方法。
输出单链表中各个结点的值
void display(linklist head)
{
linklist p;
p=head;
if(p==NULL)
printf("单链表是空表\n");
else{
printf("单链表各个结点的值为:\n");
while(P){
printf("%5d",p->info);
p=p->next;
}
}
}
- 查找第i个元素
- 工作指针P初始化;累加器count初始化;
- 重复执行(工作指针P后移,count++),直到P为空或者count==1;
- 返回P指针
按序号查找第i个结点
linklist findKth(linklist head,int i)
{
int j=1;
linklist p=head;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
return p; //找到第i个,返回第i个结点指针。如果没有找到,返回空。
- 查找值为X的结点
- 工作指针P初始化;
- 重复执行(工作指针P后移),直到P为空或p->info==x;
- 返回p指针;
按值查找值为x的结点
linklist find(linklist head,datatype x)
{
linklist p=head;
while(p!=NULL&&p->info!=x)
{
p=p->next;
}
return p; //如果找到x所在结点,p!=null,如果找不到,直接返回p即可。
- 插入
操作接口:node *insert(node *head,datatype x,int i)
算法描述:
p=(node*)malloc(sizeof(node)); //分配空间
p->info=x; //设置新结点
p->next=q->next;
q->next=p;
- 表头插入
操作接口:node *insert(node *head,datatype x,int i)
算法描述:
p=(node*)malloc(sizeof(node)); //分配空间
p->info=x; //设置新结点
p->next=head;
head=p;
- 表尾插入
操作接口:node *insert(node *head,datatype x,int i)
算法描述:
p=(node*)malloc(sizeof(node)); //分配空间
p->info=x; //设置新结点
p->next=NULL;
q->next=p;
- 删除
操作接口:node *dele(node *head,int i)
算法描述:
p=pre->next;
pre->next=p->next;
free(p);
- 删除表头
操作接口:linklist deleOne(linklist head,int i);
算法描述:
p=head;
head=p->next;
free p;
- 删除表尾
操作接口:linklist deleOne(linklist head,int i);
算法描述:
p=pre->next;
pre->next=NULL;
free (p);
- 删除X结点
操作接口:linklist deleTwo(linklist head,datatype x);
算法描述:
p=pre->p->next;
free (p);
来源:CSDN
作者:qq_44189457
链接:https://blog.csdn.net/qq_44189457/article/details/104576113