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

单链表

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

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

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

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

相关推荐
串口哑火达人4 小时前
(六)RT-Thread网络通信--AT组件与ESP8266
c语言·单片机·嵌入式硬件·mcu·物联网
仰泳的熊猫4 小时前
题目2194:蓝桥杯2018年第九届真题-递增三元组
数据结构·c++·算法
啊哦呃咦唔鱼6 小时前
LeetCode hot100-15 三数之和
数据结构·算法·leetcode
leluckys6 小时前
算法-链表-二、成对交换两个节点
数据结构·算法·链表
爱编码的小八嘎6 小时前
C语言完美演绎3—8
c语言
Irissgwe8 小时前
C&C++内存管理
c语言·开发语言·c++·c++内存管理
雾岛听蓝8 小时前
C文件操作与系统IO
linux·c语言·开发语言·经验分享·笔记·算法
随意起个昵称8 小时前
【贪心】选择尽量多的不相交区间
数据结构·算法
章小幽8 小时前
LeetCode-35.搜索插入位置
数据结构·算法·leetcode
Yupureki9 小时前
《C++实战项目-高并发内存池》3.ThreadCache构造
服务器·c语言·c++·算法·哈希算法