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

单链表

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

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

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;
	
}//尾删

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

相关推荐
灵晔君2 分钟前
【Linux】进程控制(一)——进程创建、进程终止与进程等待
linux·c语言·算法
hold?fish:palm11 小时前
24 回文链表
数据结构·c++·链表
库玛西14 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
AC赳赳老秦14 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
caimouse15 小时前
ReactOS 图形系统分析(19):颜色转换对象 — XLATEOBJ(xlateobj.c/h)
c语言·开发语言
qeen8715 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
程序员与背包客_CoderZ16 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
冻柠檬飞冰走茶16 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
嵌入式阿蔡17 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
Yyyyyy~17 小时前
【C】C语言常见概念
c语言