c语言结构体实现线性表的存储,线性表的存储方式及其操作(C语言版)

这篇博客主要总结了数据结构中的线性表,包括顺序存储和链式存储两种方式。对于顺序存储,详细介绍了如何用结构体表示线性表,以及初始化、查找、插入和删除操作的实现。链式存储部分则讲解了如何通过结构体定义链表,并提供了求表长、查找指定位置和按值查找元素、插入和删除节点的方法。博客作者还分享了自己从C++版本到C语言版本的理解过程,供读者参考学习。

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

该篇也是复习数据结构总结的 ,虽然很简单 但方便以后使用。

线性表的顺序存储

1.定义一个结构体,因为在高级语言中  数组具有随机存储的特性,所以通常用数组来表示顺序存储。

typedef struct LNode *List;structLNode{

ElementType Data[maxsize];int last; //线性表的长度为 last+1

};struct LNode L; //定义了一个结构体

List PtrL; //定义了一个结构体指针 访问下标 i的元素为 L.Data[i] 或者为 Ptr-> Data[i]

2.初始化操作

List MakeEmpty()

{

List PtrL;

PtrL= (List)malloc(sizeof(structLNode));

PtrL->last = -1;returnPtrL;

}

3.查找操作

intFind(ElementType X,List PtrL)

{int i = 0;while(i<=PtrL->last && PtrL ->Data[i] !=X)

i++;if(i>PtrL->last) return -1;else returni;

}

4.插入操作   时间复杂度为  O(N)

void Insert(ElementType X,inti,List PtrL)

{intj;if(PtrL->last == maxsize-1)

{

printf("表满");return;

}if(i<1 || i>PtrL->last+2) /*因为插入的是第 i个位置的元素 (1<=i<=1+n)*/{

printf("位置不合法");return;

}for(j=PtrL->last;j>=i-1;j--)

PtrL->Data[j+1]=PtrL->Data[j]; /*将 ai ~an 倒序向后移动*/PtrL->Data[i-1] =X;

PtrL->last++;return;

}

5.删除操作  第i个元素   1<=i<=n

void Delete(inti,List PtrL)

{intj;if(i<1 || i>PtrL->last)

{

printf("不存在第%d个元素",i);return;

}for(j=i;j<=PtrL->last;j++)

PtrL->Data[j-1] = PtrL->Data[j];

PtrL->last--;return;

}

线性表的链式存储结构

1.结构体

typedef struct LNode *List;structLNode{

ElementType Data;

List Next;//线性表的长度为 last+1

};struct LNode L; //定义了一个结构体

List PtrL; //定义了一个结构体指针 访问下标 i的元素为 L.Data[i] 或者为 Ptr-> Data[i]

2.因为链表不像顺序表那样数组直接有表长,所以 我们加上一个求表长的操作。

intLength(List PtrL)

{

List p=PtrL;int j =0;while(p) /*p不为空*/{

p= p->Next;

j++;

}returnj;

}

3.查找第K个元素

List FindKth(intK,List PtrL)

{

List p=PtrL;while(p!=NULL && i

{

p= p->Next;

i++;

}if(i == K) return p; //找到第K个返回指针

else returnNULL;

}

3.2按值查找

List Find(ElementType X,List PtrL)

{

List p= PtrL; //临时变量设置为链表表头

while(P!=NULL && p->Data !=X)

p= p->Next;returnp;

}

4.链表的插入,  这里一定要注意操作顺序

详细请看图示

List Insert(ElementType X,inti,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); //查找第 i-1个节点

if(p == NULL) //第 i-1 个节点不存在,不能插入

{

printf("参数i错");returnNULL;

}else{

s= (List)malloc(sizeof(struct LNode)); //申请填装节点

s->Data =X;

s->Next = p->Next; //新节点插入在第 i - 1个节点的后面

p->Next = s; //注意里 两句的顺序不能改变 !!!

return PtrL; //返回新的链表的头指针

}

}

5.删除操作

List Delete(int i,List PtrL) //删除第i个节点

{

List p,s;if(i == 1) //如果删除的是表的第一个节点

{

s= PtrL; //s指向第一个节点

if(PtrL != NULL) PtrL = PtrL->Next; //从链表中删除

else returnNULL;free(s);returnPtrL;

}

p= FindKth(i-1,PtrL);if(p ==NULL)

{

printf("第%d个节点不存在",i-1);returnNULL;

}else if(p->Next ==NULL)

{

printf("第%d个节点不存在",i); returnNULL;

}else{

s= p->Next; //s指向第i个节点

p->Next = s->Next; //从链表中删除

free(s); //释放被删除节点

returnPtrL;

}

}

由于刚开始学的时候书上的是C++版本,搞了半天才搞懂,而且网上查的都觉得不对劲,自己从新写了一遍提供大家和我自己参考。后续更新更多关于数据结构的内容。谢谢大家啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值