链表-嵌入式团队培训内容

因为要给新生培训,所以回来复习一下链表

首先要说的一点是,初次接触链表的概念时会比较吃力,所以同学们要多花功夫研究,可能理解起来是比较困难,但多看看博客,多跟着别人的代码敲几次,肯定可以学会的。

所谓的链表,主要还是这个字,链子都是一节一节链接起来的,节和节之间有链接。

和数组不同,数组元素的存储空间是紧挨在一起的,而链表元素的地址可以不连续,因为我们知道,链子的节与节之间可以灵活的移动,不一定非得紧挨在一起。

链表的各个元素内分为两部分,数据域和指针域。


我们先看一下单个结点的结构:

typedef struct Node {
    
    
	ElemType data; // 数据域
	struct Node *next; // 指针域
} Node;
typedef struct Node *LinkList; // 和数组的头一样,链表的头必须是一个指针类型,用来存储一个链表的首地址

然后我们要理解两个概念

  1. 头结点
  2. 头指针

:)好,首先一点:头结点是一个节点头指针的是一个指针
然后:头结点不是必须存在的头指针是必须存在的
第三:头结点的数据域一般无意义,他的存在只是为了方便对链表头部进行插入删除等操作
头指针具有标识作用,类似于数组名,所以头指针经常被冠以链表的名字
第四:如果存在头结点,那么头指针就指向头结点,如果没有头结点,那头指针就指向链表第一个结点

然后是一点要注意的:对于一个单链表来说,最后一个节点的指针域必须指向空,也就是NULL.


单链表相关的基本操作:

  1. 单链表的建立(头插法、尾插法)、有时会建立空表,就没有头插尾插一说了。
  2. 查找结点
  3. 结点插入(头插法、尾插法)
  4. 结点删除
  5. 单链表的销毁
  6. 单链表排序(结点位置的交换)

注意事项

  1. 建表:
    想清楚你是对谁进行操作,想清楚你是否要返回一个值,返回的是什么类型的值,是结构体呢,还是结构体指针。或者说你选择不返回值,而是对一个你认为是头结点的变量进行操作,那你操作的是一个结构体指针呢,还是一个二级结构体指针呢,这些都要由你自己来考虑,我也不知道具体要怎么选择。
  2. 查找结点,查找一个节点并不需要对链表结构进行修改,所以需要怎样进行操作,该向函数里传一个什么类型的参数呢。
  3. 结点的插入是重点,直接考察了你对结点和指针的认识,想想指针和指针之间的赋值操作,一个next究竟能玩出什么花样来
  4. 删除节点注意要挂起目标节点,不要直接赋值,否则该释放的空间就迷路了。
  5. 销毁 嗯嗯 没啥要注意的。

单链表的基本操作学完之后你就可以开始学生管理系统的制作了,注意代码规范(包括代码风格、变量命名风格、注释等等)

如果你一年之后再看自己现在写的代码,感觉很舒适,很清晰,那恭喜你,你的代码是很规范的,可以拿给同学们展示了。


特别说明一下交换节点:

// 对于两个结点位置的交换
// 我们这样操作
pre->next = p->next;
p->next = p->next->next;
pre->next->next = p;
// 一定要注意先后顺序,这里千万别搞错

// 然后两个指针后移,继续交换
p = p->next;
pre = pre->next;

在这里插入图片描述把这一部分搞懂了,就可以写一下单链表结点排序了,在学生管理系统里是比较重要的一部分。

之后有时间我们还会讲循环链表,双向链表。

猜你喜欢

转载自blog.csdn.net/weixin_45543674/article/details/109438258
今日推荐