C语言-链表(单链表,循环链表)

C语言-链表(单链表,循环链表)

1.链表的概念

image-20220410194407455

单链表:线性表的链接存储结构。
存储思想:用一组任意的存储单元存放线性表的元素。

image-20220410194643251 image-20220410194742384 image-20220410194807025

*next其实很好理解它是一个指针域指向另外一个相同结点的指针域

Node st; 等价于 struct node st;

Link p;等价于 struct node *p;

p=&st(p指向了st这个变量)

p = (Link)malloc(sizeof(Node))

等价于 (struct node *) malloc (sizeof(Node))

不写type of就需要写struct xxx

如何申请链表中的一个结点?

image-20220410201034901
p = (Link)malloc(sizeof(Node))

malloc分配的首地址要赋给p,先要转成指针p需要看待他的方式

如何引用数据元素和指针域?

image-20220410201405553

指针p指向了我们想要访问的这一块存储空间。

什么是存储结构?

image-20220410201503195 image-20220410201531954

重点在数据元素之间的逻辑关系的表示,所以,将实际存储地址抽象。

空表和非空表不统一, 缺点?

如何将空表与非空表统一?

加入一个头结点

image-20220410201740504

头结点:在单链表的第一个元素结点之前附设一个类型相同的结点,以便空表和非空表处理统一 。

2单链表的实现

(1)单链表的遍历操作

image-20220410201901225 image-20220410202011208

思路:

1.先将头节点传入

2.再让p指向第一个有效的结点a1

  • 如果这个链表是一个空表我们怎么考虑?
image-20220410202217308

​ 当p指向head.next就为空,啥都不做。

  • 当不是空表的时候,当p指向head.next,就是head结点的第一个有效的首地址

3.显示data域

4.显示下一个结点 p = p.next

最后的时候 p = null 就退出了

image-20220410205653379

p++能否完成后移?

p++指的是指向下一个结构体,并不是你所希望的链表的下一个结点。因为地址不是连续的。

image-20220410205819458

(2)求单链表的元素个数

image-20220410210140401 image-20220410210215686 image-20220410211323521

p !=null可以直接写成p

这里一旦找到就会提前出去,这里并没有找到,就会走到最后的false

/#include<bool.h>

(4)单链表的插入操作

p是指针,首先分配空间的函数返回的是地址,只有指针才会用到->这个符号

image-20220430200233626

1.先将p移动到合适的位置

https://www.bilibili.com/video/BV1FJ411X7w2?t=1746.3

创建结点,node指针指向

【顺序不能反】

node.next指向ai(p.next)

p.next保存node地址(有了新的之前的就断开)

这里语句顺序如果反过来,这里需要借助之前p.next去找ai这个结点,如果先断开就找不到了

image-20220430200834318

这里如果没有头结点就没法写出通用的代码适用于插在所有的位置。

image-20220430200955476
image-20220430201013140 image-20220430201044403

image-20220430202234169

5.创建一个单链表-头插法

image-20220430202448156

tips:创建好一个结点,就把他的next域设置为空。

image-20220430202711253 image-20220430202942569

数组插入的顺序和链表的顺序是相反的。

image-20220430203030165

5.创建一个单链表-尾插法

image-20220430203241587 image-20220430203328872 image-20220430203412607 image-20220430203431401

image-20220430203523630

这里如果没有设置rear.next = NULL就会指向别的不可知的位置,循环扫描的时候就结束不了,死循环。

image-20220430203711797 image-20220430203903017

6.单链表结点的删除

image-20220430204237926

image-20220430204306019

如何保存一前一后?

  • 出发的时候就一前一后
image-20220430204436095
  • 每次移动
image-20220430204513898

image-20220430204636223 image-20220430204717220 image-20220430204742582 image-20220430204807121

7.单链表的释放

image-20220430205215245

image-20220430205321612

三、循环链表的实现

image-20220430205517728 image-20220430205720586 image-20220430205735877

四、双向链表

image-20220430205858519 image-20220430205938927

五、作业《C语言-链表作业1:学生管理系统》实验内容

要求完成学生管理的链表程序。具有学生信息增加、显示、修改、删除、查找、学生人数统计功能的程序。增加学生信息时,按照学号排序;根据给定的学号,可以完成指定学号的修改、删除和查找功能。

学生管理系统的模板已经替你们把编程框架打好了,可以运行并增加记录,其他功能只写了函数头,需要在代码中修改直到完成作业。代码如下:(懒猫老师版权所有,转发请标明出处)

image-20220430211856741
posted @ 2022-04-10 21:17  记录学习Blog  阅读(632)  评论(0编辑  收藏  举报