[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; }

相关内容

热门资讯

解密关于!情怀麻将有内置挂吗(... 解密关于!情怀麻将有内置挂吗(辅助挂)外挂透视辅助挂(2021已更新)(哔哩哔哩)解密关于!情怀麻将...
科普常识!天天微友棋牌app外... 科普常识!天天微友棋牌app外 挂(辅助)一直是有挂(2025已更新)(哔哩哔哩);1、全新机制【天...
2分钟辅助挂!多乐麻将好友房破... 2分钟辅助挂!多乐麻将好友房破解,红龙软件德州扑克一直有挂,攻略方法(有挂机密)多乐麻将好友房破解是...
五分钟辅助挂!中至麻将助赢神器... 五分钟辅助挂!中至麻将助赢神器,广东雀神小程序打牌技巧,详细教程(有挂方法)1、打开德州poker外...
一分钟了解!!小宝跑得快有挂吗... 一分钟了解!!小宝跑得快有挂吗(透视)外挂透明挂辅助工具(2022已更新)(哔哩哔哩);1、完成小宝...
最新技巧!博乐龙江填大坑攻略(... 最新技巧!博乐龙江填大坑攻略(透明挂)竟然真的是有挂(2020已更新)(哔哩哔哩)1、任何博乐龙江填...
8分钟了解!心悦麻将助赢神器购... 8分钟了解!心悦麻将助赢神器购买,德州app一贯真的有挂,辅助教程(有挂秘笈)1、心悦麻将助赢神器购...
六分钟辅助挂!约战荆门麻将规律... 1、六分钟辅助挂!约战荆门麻将规律,雀神广东麻将输赢数据怎么看,详细教程(有挂黑科技);详细教程。2...
一分钟辅助挂!陕麻圈外 挂是真... 一分钟辅助挂!陕麻圈外 挂是真是假,WpK原来存在有挂,AA德州教程(有挂实操);运陕麻圈外 挂是真...
最新研发!白金岛字牌辅助(辅助... 最新研发!白金岛字牌辅助(辅助挂)真是真的有挂(2025已更新)(哔哩哔哩);1、每一步都需要思考,...