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

单链表

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

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

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

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

相关推荐
靠近彗星24 分钟前
3.3栈与队列的应用
数据结构·算法
朱嘉鼎2 小时前
C语言之可变参函数
c语言·开发语言
while(1){yan}2 小时前
数据结构之链表
数据结构·链表
Han.miracle4 小时前
数据结构——二叉树的从前序与中序遍历序列构造二叉树
java·数据结构·学习·算法·leetcode
独自破碎E7 小时前
判断链表是否为回文
数据结构·链表
你好,我叫C小白7 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
朱嘉鼎9 小时前
状态机的介绍
c语言·单片机
Neverfadeaway10 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
一碗绿豆汤10 小时前
c语言-流程控制语句
c语言
子牙老师10 小时前
从零手写gdb调试器
c语言·linux内核·gdb·调试器