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

相关内容

热门资讯

透视好友!wepoker透视脚... 透视好友!wepoker透视脚本下载,wepoker作弊视频(一直是有挂)1、该软件可以轻松地帮助玩...
透视新版!wpk辅助,wpk控... 透视新版!wpk辅助,wpk控制牌是真的吗,插件教程(好像是真的有挂)wpk控制牌是真的吗辅助器中分...
透视好友房!wepoker底牌... 透视好友房!wepoker底牌透视,wepoker私人局规律(其实真的是有挂)1、wepoker私人...
透视辅助!wpk辅助哪里买,w... 透视辅助!wpk辅助哪里买,wpk俱乐部是真的吗,插件教程(本来真的是有挂);1、这是跨平台的wpk...
透视透视挂!wepoker怎么... 透视透视挂!wepoker怎么挂底牌,wepoker作弊视频(竟然存在有挂)1、wepoker怎么挂...
透视能赢!wpk显示有作弊,w... 透视能赢!wpk显示有作弊,wpk模拟器是什么,总结教程(原来真的有挂)1、每一步都需要思考,不同水...
透视最新!wepoker透视脚... 透视最新!wepoker透视脚本免费app,wepoker私人局规律(其实是有挂)1、该软件可以轻松...
透视实锤!wpk德州局怎么透视... 透视实锤!wpk德州局怎么透视,如何下载wpk透视版,系统教程(都是真的是有挂)1、游戏颠覆性的策略...
透视安卓版!wepoker透视... 透视安卓版!wepoker透视底牌,wepokerplus外挂(切实真的是有挂);1、打开软件启动之...
透视挂透视!wpk辅助器是真的... 透视挂透视!wpk辅助器是真的吗,wpk控制牌是真的吗,曝光教程(真是有挂)wpk控制牌是真的吗是一...