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

相关内容

热门资讯

透视脚本!hh poker软件... 透视脚本!hh poker软件"微扑克系统是不是有问题"(一直真的有挂)1、打开软件启动之后找到中间...
一分钟了解!wepoker破解... 一分钟了解!wepoker破解器,德普之星辅助器app,详细教程(有挂脚本);1、德普之星辅助器ap...
透视脚本!wepoker钻石怎... 您好,wepoker钻石怎么看底牌这款游戏可以开挂的,确实是有挂的,需要了解加微【487309276...
总算了解!aapoker插件,... 总算了解!aapoker插件,wepoker私人局辅助挂,详细教程(有挂攻略)1、下载好wepoke...
透视脚本!竞技联盟破解版最新版... 透视脚本!竞技联盟破解版最新版"云扑克辅助"(果然真的有挂)1、每一步都需要思考,不同水平的挑战会更...
每日必看教程!wepoker底... 每日必看教程!wepoker底牌透视,wepoker轻量版透视系统,详细教程(有挂技巧);1、每一步...
透视脚本!德州私人局脚本&qu... 透视脚本!德州私人局脚本"智星德州菠萝有没有挂"(一贯真的有挂)1、超多福利:超高返利,海量正版游戏...
一分钟了解!wpk安卓下载辅助... 一分钟了解!wpk安卓下载辅助,wepoker透视最简单三个步骤,详细教程(有挂教学);1、用户打开...
透视脚本!hhpkoer辅助器... 透视脚本!hhpkoer辅助器视频"微扑克wpk"(一直真的有挂)1、实时hhpkoer辅助器视频开...
查到实测!wepokerplu... 查到实测!wepokerplus辅助,哈糖大菠萝挂法,详细教程(有挂教学)1、让任何用户在无需哈糖大...