数据结构——线性链表/单链表设计

目录

深入理解和设计:

结构体设计

初始化

插入——头插

插入—— 尾插

插入 —— 按位置插 

删除——头删

删除 —— 尾删

删除 —— 按位置删

删除——按值删

判空 

查找

获取有效个数

清空

销毁1——使用头结点

销毁2 —— 不使用头结点

打印

测试用例:

测试结果:


在设计单链表时,我们首先要引入单链表的定义,你首先得知道它是什么?

  • 结点:用一组任意的存储单元存储线性表的数据元素(存储单元可以是连续的,也可以是不连续的),对其中一个数据元素来说,不仅要存储其本身的信息之外没还需存储一个指示其直接后继的信息(即直接后继的存储位置),这两部分信息组成这个数据元素的存储映像,称为结点。
  • 线性链表/单链表:结点包括两个域,存储数据元素信息的被称为数据域,存储其直接后继存储位置的域称为指针域,指针域中存储的信息称作指针/链。多个结点链接成一个链表,即为线性表的链式存储结构,又由于此链表的每个结点中只包含一个指针域,故又称为线性链表或单链表。
  • 基础设计:整个链表的存取必须从头指针开始进行头指针指示链表中第一结点(即第一个数据元素的存储映像)的存储位置,同时由于最后一个数据元素没有直接后继,则其指针为空。我们一般会在单链表的第一个结点之前附设一个结点,称之为头结点。头结点的数据域可以不存储任何信息,也可以存储如线性表的长度等类的附加信息,头结点的指针域存储直线法第一个结点的指针(即第一个元素结点的存储位置)
数据结构——线性链表/单链表设计_第1张图片 不带头结点的单链表

                                                        

数据结构——线性链表/单链表设计_第2张图片 带头结点的单链表

 而我们下来要设计的也就是带头结点的单链表。单链表头结点值保存第一个有效节点的地址,也就是只需要使用其指针域即可。

深入理解和设计:

结构体设计

我们先对其进行结构体设计,单链表里面的结点只有数据域和指针域,因此结构体里面的成员我们只需要设计两个就好了。

typedef struct Node {
	ElemType data;	//数据域
	struct Node *next;	//指针域
}Node,*PNode;
初始化
//初始化
void Init_List(PNode pn) {
	assert(pn != NULL);
	if (pn == NULL)	return;

	pn->next = NULL;
}

我们对其进行初始化的时候,也就是先对其头结点进行初始化,由于我们对其数据域不进行使用,因此是需要对其指针域进行初始化—— next -> NULL  就行了。

至于这里的 assert 和 if 两处的代码我在之前的不定长顺序表中有说过~大家可以过去看看,顺便对比一下顺序表和链表的区别。

附上链接~

数据结构——不定长顺序表_WLin.的博客-CSDN博客https://blog.csdn.net/m0_70184760/article/details/124641621?spm=1001.2014.3001.5501在下面的设计叙述中,大家一定要注意结点自身地址和此结点的指针域是不一样的,结点的指针域是其下一个要指向结点的自身地址,不要搞混淆了。

插入——头插

你可能感兴趣的:(数据结构,数据结构,链表)