数据结构学习小结(4)——线性表的链式存储

本文介绍线性表的链式存储实现,其通过“链”建立元素逻辑关系,插入、删除只需改“链”。还阐述主要操作,如求表长、查找、插入、删除,此外介绍广义表是线性表推广,多重链表节点可属多个链,用于复杂数据结构存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线性表的链式存储实现

不要求逻辑上相邻的两个元素在物理上也相邻:通过“”建
立起数据元素之间的逻辑关系。
插入、别除不需要移动数据元素,只需要修改“链”

主要操作的实现

1.求表长

int Length (List PtrL)
{
List p=PtrL;
int j=0;
while (p){
p=p->Next;
j++;
}
return j;
}

2.查找

(1)按序号查找:FindKth;

List FindKth(int K,List PtrL)
{
List p=PtrL;
int i=1;
while (p !=NULL &&i<K)
{
p=p->Net;
i++;
}
if (i==K)
return p;
else return NULL;

(2)按查找:Find

List Find(ElementType X,List PtrL)
{List p=PtrL;
while p!=NULL && p->Data !=X
p=p->Next;
return p;
}

3.插入

在第i-1(1≤i<=n+1)个结点后插入一个值为X的新结点
(1)先构造一个新结点,用s指向:
(2)再找到链表的第i-1个结点,用p指向:
(3)然后修改指针,插入结点(p之后插入新结点是s)

List Insert(ElementType X,int i,List PtrL)
{List p,s;
if(i==1]{
s =(List)malloc(sizeof(struct LNode)):
s->Data =X;
s->Next=PtrL;
return s;
}
p=FindKth(i-1,PtrL )
if(p==NULL){
printf("参数i错")return NULL;
}
else
{
s =(List)malloc(sizeof(struct LNode));
s->Data=X;
s->Next=p->Next;
p->Next=s;
return PtrL;
}

4删除

删除链表的第i(1<=i<=n)个位置上的结点
(1)先找到链表的第i-1个结点,用p指向:
(2)再用指针s指向要被别除的结点(p的下一个结点):
(3)然后修改指针,删除s所指结点:
(4)最后释放s所指结点的空间。

List Delete(int i,List PtrL)
{List p,s;
if(i==1)
{
s=PtrL;
if (PtrL!=NULL)PtrL= PtrL->Next;
else return NULL;
free(s);
return PtrL;
}
p=FindKth(i-1,PtrL )
if (p ==NULL)
{
printf〔“第%d个结点不存在",i-1);
}
else if (p->Next =NULL)
{
printf(%d个结点不存在",i);
}
else
{
s=p->Next;
p->Next =s->Next;
free(s);
return PtrL;
}

广义表

广义表(Generalized List)
广义表是线性表的推广
对于线性表而言,n个元素都是基本的单元素:
广义表中,这些元素不仅可以是单元素也可以是另一个广义表。

多重链表

多重列表:链表中的节点可能同时求属于多个链
多重链表中结点的指针域会有多个
但包含两个指针域的链表并不一定是多重链表,比如在双向链表不是多重链表。
多重链表有广泛的用途:基本上如树、图这样相对复杂的数据结构都可以采用多重链表方式实现存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值