创建一个简单的双链表

avatar
作者
筋斗云
阅读量:0

1.ListNode.h头文件

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> typedef int LTDataType; typedef struct ListNode { 	struct ListNode* next; 	struct ListNode* prev; 	LTDataType data; }LN; //初始化 LN* ListInit(); //尾插 void ListPushBank(LN* plist, LTDataType x); //头插 void ListPushFront(LN* plist, LTDataType x); //打印 void List_print(LN* plist); //尾删 void ListPopBank(LN* plist); //头删 void ListPopFront(LN* plist); //查找 LN* ListFind(LN* plist,LTDataType x); //pos之前插入x void ListInsert(LN* pos, LTDataType x); //删除pos位置 void ListErase(LN* pos); //销毁 void ListDestroyed(LN* plist); 

2.ListNode.c源文件函数的实现代码

#include"ListNode.h" //创建节点 LN* BuyListNode(LTDataType x) { 	LN* newnode = (LN*)malloc(sizeof(LN)); 	newnode->data = x; 	newnode->next = newnode->prev = newnode; 	return newnode; } //初始化 LN* ListInit() { 	LN* newnode = BuyListNode(0);//哨兵位 } //尾插 void ListPushBank(LN* plist,LTDataType x) { 	assert(plist); 	LN* ret = plist->prev; 	LN* newnode = BuyListNode(x);  	ret->next = newnode; 	newnode->next = plist; 	newnode->prev = ret; 	plist->prev = newnode; 	//快捷 	//ListInsert(plist->prev->next, x); } //打印 void List_print(LN* plist) { 	LN* ret = plist->next;//哨兵不需要打印 	while (ret != plist) 	{ 		printf("%d->", ret->data); 		ret = ret->next; 	} 	printf("NULL\n"); } //头插 void ListPushFront(LN* plist, LTDataType x) { 	assert(plist); 	LN* newnode = BuyListNode(x); 	LN* first = plist->next;  	plist->next = newnode; 	newnode->next = first; 	first->prev = newnode; 	newnode->prev = plist; 	//ListInsert(plist->next, x); } //尾删 void ListPopBank(LN* plist) { 	assert(plist); 	assert(plist->next != plist);  	LN* pcur = plist->prev; 	pcur->prev->next = plist; 	plist->prev = pcur->prev; 	free(pcur); 	pcur = NULL; 	//ListErase(plist->prev); } //头删 void ListPopFront(LN* plist) { 	assert(plist); 	assert(plist->next != plist); 	LN* first = plist->next; 	plist->next = first->next; 	first->next->prev = plist; 	free(first); 	 	//快捷方式 	//ListErase(plist->next); } //查找 LN* ListFind(LN* plist, LTDataType x) { 	assert(plist); 	LN* ret = plist->next; 	while (ret != plist) 	{ 		if (x == ret->data)  		{ 			return ret; 		} 		ret = ret->next; 	} 	return NULL; } //pos之前插入内容 void ListInsert(LN* pos, LTDataType x) { 	assert(pos); 	LN* newnode = BuyListNode(x); 	LN* pcur = pos->prev; 	pcur->next = newnode; 	newnode->next = pos; 	newnode->prev = pcur; 	pos->prev = newnode; } //删除pos位置 void ListErase(LN* pos) { 	assert(pos); 	LN* prev = pos->prev; 	LN* next = pos->next; 	prev->next = next; 	next->prev = prev; 	free(pos); } //销毁 void ListDestroyed(LN* plist) { 	assert(plist); 	LN* cur = plist->next; 	while (cur != plist) 	{ 		LN* ret = cur->next; 		free(cur); 		cur = ret; 	} 	free(plist); 	plist = NULL; 	printf("销毁成功\n"); }

3.test.c测试代码
 

#define  _CRT_SECURE_NO_WARNINGS 1 #include"ListNode.h" void menu() { 	printf("*******************\n"); 	printf("1.尾插       2.头插\n"); 	printf("3.尾删       4.头删\n"); 	printf("5.打印       6.查找\n"); 	printf("7.pos插入 8.删除pos\n"); 	printf("9.销毁      10.退出\n"); 	printf("*******************\n"); } int main() { 	LN* plist = ListInit(); 	int input = 0, x = 0, y = 0; 	do 	{ 		menu(); 		printf("请输入你需要操作的内容\n"); 		scanf("%d", &input); 		switch (input) 		{ 		case 1: 			printf("请输入你要尾插的内容,输入-1结束\n"); 			do 			{ 				scanf("%d", &x); 				if (x != -1) 				{ 					ListPushBank(plist, x); 				} 			} while (x != -1); 			break; 		case 2: 			printf("请输入你要头插的内容,输入-1结束\n"); 			do 			{ 				scanf("%d", &x); 				if (x != -1) 				{ 					ListPushFront(plist, x); 				} 			} while (x != -1); 			break; 		case 3: 			ListPopBank(plist); 			printf("尾删成功\n"); 			break; 		case 4: 			ListPopFront(plist); 			printf("头删成功\n"); 			break; 		case 5: 			List_print(plist); 			break; 		case 6: 			printf("请输入你要查找的数值\n"); 			scanf("%d", &x); 			LN* ret = ListFind(plist, x); 			if (ret != NULL) 			{ 				printf("找到了\n"); 			} 			else { 				printf("找不到你要的数值\n"); 			} 			break; 		case 7: 			printf("请输入pos的值\n"); 			scanf("%d", &x); 			LN* ret2 = ListFind(plist, x); 			if (ret2 == NULL) 			{ 				printf("你要查找的pos节点不存在\n"); 				exit(1); 			} 			else  			{ 				printf("请输入你要插入的数值\n"); 				scanf("%d", &y); 				ListInsert(ret2, y); 				printf("插入成功\n"); 			} 			break; 		case 8: 			printf("请输入你要删除的pos点\n"); 			scanf("%d", &x); 			LN* ret3 = ListFind(plist, x); 			if (ret3 == NULL) 			{ 				printf("要删除的pos点不存在\n"); 				exit(1); 			} 			else  			{ 				ListErase(ret3); 				printf("删除成功\n"); 			} 			break; 		case 9: 			ListDestroyed(plist); 			break; 		case 10: 			input = -1; 			printf("退出中..."); 			break; 		default: 			printf("请选择1-10的方法\n"); 			break; 		} 	} while (input != -1); 	return 0; }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!