《重生到现代之从零开始的数据结构生活》——单链表

单链表

和顺序表不同,单链表是物理结构上非连续,非顺序的储存结构,但是在逻辑上是连续的。通过指针来实现

他的结构是怎么样的呢?为什么说它是物理结构上非连续呢

c 复制代码
struct slist{
   int val;//储存的数值
   struct slist *next;//下一个结点的指针
};

那么结点是什么呢

和顺序表不一样,单链表里面的空间都是独立申请下来的,我们称这一个个独立的空间叫结点

所以就是说,单链表中有两个组成部分:单链表中储存的值,还有指向下一个结点的指针

所以大家应该知道为什么单链表是逻辑上是连续的,但是物理结构上不连续

头插

一个单链表会有怎么头插

头插就是在链表的头上插一个数据

但是单链表的数据在物理结构上不连续,那么我们怎么实现呢

我们写一个粗糙的模拟代码(没有考虑NULL)

c 复制代码
#include<stdio.h>
#include<stdlib.h>
typedef struct list list;
struct list {
	int val;
	struct list* next;
}; //定义一个结构体

list* buymem(int x)
{
	list* a = (list*)malloc(sizeof(list));
	a->val = x;
	a->next = NULL;
	return a;

}//创建内存


void listprint(list* a)
{
	while (a->next)
	{
		printf("%d->", a->val);
		a = a->next;
	}

	printf("NULL\n");
}//打印单链表

list* headinsert(list** pphead,int x)//因为要更改实参,所以用双重指针
{ 
	list*b=buymem(x);
	b->next = *pphead;
	list* newhead = b;
	return newhead;


}//!!!!!!头插
int main() {

	list * list1 = (list*)malloc(sizeof(list));
	list * list2 = (list*)malloc(sizeof(list));
	list * list3 = (list*)malloc(sizeof(list));
	list * list4 = (list*)malloc(sizeof(list));

	list1->val = 1;
	list2->val = 2;
	list3->val = 3;
	list4->val = 4;

	list1->next = list2;
	list2->next = list3;
	list3->next = list4;
	list4->next = NULL;

	listprint(list1);
	list * head=headinsert(&list1,3);
	listprint(head);
	

	return 0;

思路就是创造一个新节点,让他的next指针指向原来的头节点,这样就能联系到一起啦

尾删

就是删除末尾的一个结点

我们要做的有:将倒数第二个结点的next指针指向NULL,然后将最后一个动态空间返还

所以我们来

c 复制代码
void * lastdel(list ** pphead) {
	assert(pphead && *pphead);
	if ((*pphead)->next==NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	list* pcur = NULL;
	list* ptail = *pphead;
	while (ptail->next)
	{
		pcur = ptail;
		ptail = ptail->next;
	}
	free(ptail);
	
	ptail = pcur;
	ptail->next = NULL;
	
}//尾删

今天的知识讲解完啦,如果觉得有用可以点一下赞和关注,也可以先收藏以防需要时找不到哦,当然如果作者写的哪里有问题欢迎指出,我们一起进步!!!
祝看到这里的人天天开心哦(笔芯)

相关推荐
和光同尘@9 分钟前
74. 搜索二维矩阵(LeetCode 热题 100)
数据结构·c++·线性代数·算法·leetcode·职场和发展·矩阵
zl_dfq26 分钟前
数据结构之【顺序表简介】
数据结构·顺序表
code bean34 分钟前
【C# 数据结构】队列 FIFO
开发语言·数据结构·c#
梅茜Mercy1 小时前
数据结构:栈和队列详解(下)
数据结构
Trouvaille ~1 小时前
【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
数据结构·c++·算法·蓝桥杯·计算机科学·平衡二叉树·avl
我爱蛋蛋后1 小时前
Linux驱动开发之音频驱动与基础应用编程
linux·c语言·驱动开发·音视频
卷卷的小趴菜学编程2 小时前
c++之多态
c语言·开发语言·c++·面试·visual studio code
夏末秋也凉2 小时前
力扣-回溯-491 非递减子序列
数据结构·算法·leetcode
大白的编程日记.4 小时前
【C++笔记】C+11深度剖析(三)
c语言·开发语言·c++
老菜鸡mou4 小时前
[OD E 100] 生成哈夫曼树
数据结构·c++