寒假关于学习数据结构周笔记(二)

本文详细介绍了线性表的链式存储结构,特别是单链表的实现。内容包括单链表的空表状态、节点结构、数据读取、插入和删除操作的算法及代码实现。强调了插入和删除操作中指针修改的顺序重要性,并阐述了单链表作为动态结构的优势。同时,提到了单链表的整表创建过程,涉及节点生成、数据填充和链表构造。
摘要由CSDN通过智能技术生成

线性表链式存储结构代码描述

若线性表为空表,则头结点的指针域为“空”,如图所示。在这里插入图片描述
这里我们大概地用图示表达了内存中单链表的存储状态。看着满图的省略号…你就知道是多么不方便。而我们真正关心的:它是在内存中的实际位置吗?不是的,这只是它所表示的线性表中的数据元素及数据元素之间的逻辑关系。
所以我们改用更方便的存储示意图来表示单链表,如图所示。在这里插入图片描述
若带有头结点的单链表,则如图所示。在这里插入图片描述

空链表如图3-6-9所示。在这里插入图片描述
单链表中,我们在C语言中可用结构指针来描述。
/线性表的单链表存储结构/

typedef struct Node

ElemType data;
struct Node *next;

} Node;

typedef struct Node *LinkList; /定义 LinkList/
从结构定义可知,结点由存放数据元素的数据域存放后继结点地址的指针域组成。
单链表的读取
获得链表第i个数据的算法思路:
1.声明一个结点p指向链表第一-个结点, 初始化j从1开始;

2.当j<i时, 就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
3.若到链表末尾p为空,则说明第i个元素不存在;

4.否则查找成功,返回结点p的数据。

实现代码算法如下:

/*初始条件:顺序线性表工已存在,1≤i≤ListLength(I) */

/操作结果:用e返回工中第1个数据元素的值/

Status GetElem ( LinkList L,int i,ElemType te)

/让p指向链表工的第一个结点/

j=1;/为计数器/

while (p && j<i) /p不为空或者计数器」还没有等于主时,循环继续/

p= p->next; /让p指向下一个结点/
++j;

if( !p||j>i )

return ERROR; /第i 个元素不存在/
*e=p->date;/取第一个元素的数据/
return OK;

单链表的插入与删除
1.单链表的插入:先来看单链表的插入。假设存储元素e的结点为s,要实现结点p、p->next 和s之间逻辑关系的变化,只需将结点s插入到结点p和p->next之间即可。可如何插入呢?
在这里插入图片描述
根本用不着惊动其他结点,只需要让s->next和p->next的指针做点改变即可。
s->next=p->next;p->next=s;
解读这两句代码,也就是说让p的后继结点改成s的后继结点,再把结点s变成p的后继结点(如图所示)。在这里插入图片描述
考虑-下,这两句的顺序可不可以交换?如果先p->next=s; 再s->next=p->next; 会怎么样?哈哈,因为此时第一-句会使得将p->next给覆盖成s的地址了。那么s->next=p->next,其实就等于s->next=s,这样真正的拥有ai;1 数据元素的结点就没了上级。这样的插入操作就是失败的,造成了临场掉链子的尴尬局面。所以这两句是无论如何不能反的,这点初学者- -定要注意。插入结点s后,链表如图所示。在这里插入图片描述对于单链表的表头和表尾的特殊情况,操作是相同的,如图所示。在这里插入图片描述
单链表第i个数据插入结点的算法思路:

1.声明-结点P指向链表第一一个结点, 初始化j从1开始;

2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点, j累加1;
3.若到链表末尾p为空,则说明第i个元素不存在;

4.否则查找成功,在系统中生成-一个空结点s;

5.将数据元素e赋值给s->data;

6.单链表的插入标准语句s->next=p->next p->next=s;

7.返回成功。
现在我们再来看单链表的删除。
设存储元素a的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可,如图所示。在这里插入图片描述
我们所要做的,实际上就是一步,p->next=p->next>next, 用q来取代p->next,
即是
q=p->next; p->next=q->next;
解读这两句代码,也就是说让p的后继的后继结点改成P的后继结点。有点拗口呀,那我再打个形象的比方。本来是爸爸左手牵着妈妈的手,右手牵着宝宝的手在马路边散步。突然迎面走来-一美女,爸爸-下子看呆了,此情景被妈妈逮个正着,于是她生气地甩开牵着的爸爸的手,绕过他,扯开父子俩,拉起宝宝的左手就快步朝前走去。此时妈妈是p结点,妈妈的后继是爸爸p->next,也可以叫q结点,妈妈的后继的后继是儿子p->next>next, 即q->next。 当妈妈去牵儿子的手时,这个爸爸就已经与母子俩没有牵手联系了,如图所示。在这里插入图片描述单链表第i个数据刪除结点的算法思路:
1.声明一结点p指向链表第一一个结点,初始化j从1开始;
2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一-个结点, j累加
3.若到链表末尾P为空,则说明第i个元素不存在;
4.否则查找成功,将欲删除的结点p->next赋值给q;
5.单链表的删除标准语句p->next=q->next;
6.将q结点中的数据赋值给e,作为返回;
7.释放q结点;
8.返回成功。
对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显。
回顾一下,顺序存储结构的创建,其实就是一一个数组的初始化,即声明-一个类型和大小的数组并赋值的过程。而单链表和顺序存储结构就不一样, 它不像顺序存储结构这么集中,它可以很散,是一一种动态结构。对于每个链表来说,它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成。所以创建单链表的过程就是一个动态生成链表的过程。即从“空表”的初始状态起,依次建立各元素结点,并逐个插入链表。

单链表整表创建的算法思路:

1.声明一结点p和计数器变量i;

2.初始化一-空链表L;

3.让L的头结点的指针指向NULL,即建立一个带头结点的单链表;

4.循环:

◆生成一新结点赋值给 p;

◆随机生成- -数字赋值给P的数据域p->data; .

◆将p插入到头结点与前一-新结点之间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值