[C语言][数据结构][链表] 单链表的从零实现!
创始人
2024-11-11 01:08:47
0

目录

零.必备知识

1.一级指针 && 二级指针

2. 节点的成员列表

    a.数据

    b.指向下一个节点的指针.

3. 动态内存空间的开辟 (malloc-calloc-realloc)

一.单链表的实现与销毁 

        1.1 节点的定义

        1.2 单链表的尾插

        1.3 单链表的头插

        1.4 单链表的尾删

        1.5 单链表的头删 

        1.6 单链表的查找

        1.7 在指定位置之前插入数据

        1.8 在指定位置之后插入数据

        1.9 删除指定位置的数据

        1.10 删除指定位置之后的数据

        1.11 销毁单链表 

二. 单链表源码

SingleList.h

SingleList.c 


零.必备知识

1.一级指针 && 二级指针

2. 节点的成员列表

    a.数据

    b.指向下一个节点的指针.

3. 动态内存空间的开辟 (malloc-calloc-realloc)


一.单链表的实现与销毁 

注:具体解释都在代码的注释中!(在代码中具体分析)

        1.1 节点的定义

        1.2 单链表的尾插

 

        1.3 单链表的头插

 

        1.4 单链表的尾删

        1.5 单链表的头删 

        1.6 单链表的查找

        1.7 在指定位置之前插入数据

        1.8 在指定位置之后插入数据

        

 

        1.9 删除指定位置的数据

        1.10 删除指定位置之后的数据

        1.11 销毁单链表 

二. 单链表源码

SingleList.h

#define  _CRT_SECURE_NO_WARNINGS #pragma once #include  #include  #include   // 节点的定义 typedef int SLTDateType; typedef struct SingleListNode { 	SLTDateType date; 	struct SingleListNode* next; }SLTNode;  // 单链表的展示 void SLTPrint(SLTNode* phead); // 单链表的尾插 void SLTPushBack(SLTNode** pphead, SLTDateType x); // 单链表的头插 void SLTPushFront(SLTNode** pphead, SLTDateType x); // 单链表的尾删 void SLTPopBack(SLTNode** pphead); // 单链表的头删 void SLTPopFront(SLTNode** pphead); // 单链表的查找 SLTNode* SLTFind(SLTNode* phead, SLTDateType x); // 在指定位置之前插入数据 void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDateType x); // 在指定位置之后插入数据 void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x); // 删除指定位置的数据 void SLTErase(SLTNode** pphead, SLTNode* pos); // 删除指定位置之后的数据 void SLTEraseAfter(SLTNode** pphead, SLTNode* pos); // 销毁单链表 void SLTDestroy(SLTNode** pphead);

SingleList.c 

#define  _CRT_SECURE_NO_WARNINGS #include "SingleList.h" // 单链表的展示 void SLTPrint(SLTNode* phead) { 	SLTNode* pcur = phead; //current 当前的,现在的  currect 正确的 	while (pcur != NULL) { 		printf("%d->", pcur->date); 		pcur = pcur->next; 	} 	printf("NULL\n"); } // 节点的创造 SLTNode* SLTCreat(SLTDateType x) { 	SLTNode* newNode = (SLTNode*)malloc(sizeof(SLTNode)); 	if (newNode == NULL) { 		printf("创建失败!\n"); 		exit(1); 	} 	newNode->date = x; 	newNode->next = NULL; 	return newNode; } // 单链表的尾插 void SLTPushBack(SLTNode** pphead, SLTDateType x) { 	assert(pphead); 	// 创建节点 	SLTNode* newNode = SLTCreat(x); 	// 没有节点 	if ((*pphead) == NULL) { 		(*pphead) = newNode; 	} 	else { // 有一个或多个节点 		SLTNode* pcur = (*pphead); 		while (pcur->next != NULL) { 			pcur = pcur->next; 		} 		pcur->next = newNode; 	} } // 单链表的头插 void SLTPushFront(SLTNode** pphead, SLTDateType x) { 	assert(pphead); 	SLTNode* pcur = (*pphead); 	// 创建节点 	SLTNode* newNode = SLTCreat(x); 	// 没有节点 	if ((*pphead) == NULL) { 		(*pphead) = newNode; 	} 	else { // 有一个或者多个节点 		newNode->next = (*pphead); 		(*pphead) = newNode; 	} } // 单链表的尾删 void SLTPopBack(SLTNode** pphead) { 	assert(pphead && (*pphead)); 	SLTNode* pcur = (*pphead); 	SLTNode* prev = (*pphead); 	// 只有一个节点 	if (pcur->next == NULL) { 		free(*pphead); 		(*pphead) = NULL; 		pcur = NULL; 		prev = NULL; 	} 	else { // 有多个节点 		while (pcur->next != NULL) { 			prev = pcur; 			pcur = pcur->next; 		} 		free(pcur); 		pcur = NULL; 		prev->next = NULL; 	} } // 单链表的头删 void SLTPopFront(SLTNode** pphead) { 	assert(pphead && (*pphead)); 	SLTNode* pcur = (*pphead); 	// 只有一个节点 	if (pcur->next == NULL) { 		free(*pphead); 		(*pphead) = NULL; 		pcur = NULL; 	} 	else { //有多个节点 		(*pphead) = (*pphead)->next; 		free(pcur); 		pcur = NULL; 	} } // 单链表的查找 SLTNode* SLTFind(SLTNode* phead, SLTDateType x) { 	SLTNode* pcur = phead; 	while (pcur != NULL) { 		if (pcur->date == x) { 			printf("找到了!\n"); 			return pcur; 		} 		pcur = pcur->next; 	} 	printf("找不到!\n"); 	return NULL; } // 在指定位置之前插入数据 void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDateType x) { 	assert(pphead); 	SLTNode* pcur = (*pphead); 	// 创建节点 	SLTNode* newNode = SLTCreat(x); 	// 头插 	if (pos == (*pphead) || (*pphead) == NULL) { 		SLTPushFront(pphead, x); 	} 	else { //正常插入 		while (pcur->next != NULL) { 			if (pcur->next == pos) { 				newNode->next = pcur->next; 				pcur->next = newNode; 				break; 			} 			pcur = pcur->next; 		} 	} } // 在指定位置之后插入数据 void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x) { 	assert(pphead); 	// 创建节点 	SLTNode* newNode = SLTCreat(x); 	if ((*pphead) == NULL || pos == (*pphead)) { 		// 尾插 		SLTPushBack(pphead, x); 	} 	else { //正常插入 		SLTNode* pcur = (*pphead); 		while (pcur->next != NULL) { 			if (pcur == pos) { 				newNode->next = pcur->next; 				pcur->next = newNode; 				break; 			} 			pcur = pcur->next; 		} 	} } // 删除指定位置的数据 void SLTErase(SLTNode** pphead, SLTNode* pos) { 	assert(pphead && (*pphead)); 	// 处理特殊情况(头删) 	if ((*pphead) == pos) { 		SLTPopFront(pphead); 	} 	else { 		SLTNode* prev = (*pphead); 		SLTNode* pcur = (*pphead); 		while (pcur != NULL) { 			if (pcur == pos) { 				prev->next = pcur->next; 				free(pcur); 				pcur = NULL; 				prev = NULL; 				break; 			} 			prev = pcur; 			pcur = pcur->next; 		} 	} } // 删除指定位置之后的数据 void SLTEraseAfter(SLTNode** pphead, SLTNode* pos) { 	assert(pphead && (*pphead)); 	SLTNode* pcur = (*pphead); 	while (pcur->next != NULL) { 		if (pcur == pos) { 			SLTNode* tmp = pcur->next; 			pcur->next = pcur->next->next; 			free(tmp); 			tmp = NULL; 			break; 		} 		pcur = pcur->next; 	} } // 销毁单链表 void SLTDestroy(SLTNode** pphead) { 	assert(pphead && (*pphead)); 	SLTNode* pcur = (*pphead); 	SLTNode* prev = (*pphead); 	while (pcur != NULL) { 		prev = pcur; 		pcur = pcur->next; 		free(prev); 	} 	prev = NULL; 	(*pphead) = NULL; }

相关内容

热门资讯

7分钟胜率!(红龙扑克)是有挂... 【福星临门,好运相随】;7分钟胜率!(红龙扑克)是有挂辅助挂吗,微扑克代打其实是真的有挂的,详细教程...
六分钟德州版!(wpk实测)确... 大家肯定在之前wpk实测或者wpk实测中玩过六分钟德州版!(wpk实测)确实真的是有挂吗,wpk实测...
3分钟长期!Wepoke代打a... 您好,Wepoke代打ai这款游戏可以开挂的,确实是有挂的,需要了解加微【841106723】很多玩...
五分钟针对!(暮雪娱乐)其实是... 五分钟针对!(暮雪娱乐)其实是确实有挂,暮雪娱乐真的是有挂吗,详细教程(有挂规律)-哔哩哔哩;1、完...
8分钟分钟!WPK透视挂原来有... 8分钟分钟!WPK透视挂原来有挂猫腻,情怀长城麻将是有挂猫腻吗,详细教程(2022已更新)(哔哩哔哩...
十分钟辅助!(Wepoke代打... 您好,Wepoke代打ai这款游戏可以开挂的,确实是有挂的,需要了解加微【841106723】很多玩...
二分钟安装!(广西八一字牌)其... 二分钟安装!(广西八一字牌)其实有挂猫腻,广西八一字牌真的是有挂吗,详细教程(有挂细节)-哔哩哔哩;...
八分钟辅助挂!(Wepoke代... 八分钟辅助挂!(Wepoke代打)是有挂辅助挂吗,Wepoke代打详细教程(果真有挂)-哔哩哔哩;W...
二分钟分钟!AAPOKER原来... 二分钟分钟!AAPOKER原来是有挂,榕城510k原来是真的有挂,详细教程(2025已更新)(哔哩哔...
5分钟苹果版!(钱柜手游)原来... 5分钟苹果版!(钱柜手游)原来一直都是有挂,钱柜手游确实是真的有挂吗,详细教程(有挂细节)-哔哩哔哩...