首页 > 其他分享 >创建一个简单的双链表

创建一个简单的双链表

时间:2024-08-02 14:26:32浏览次数:17  
标签:LN 创建 printf pos next 简单 双链 newnode plist

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

标签:LN,创建,printf,pos,next,简单,双链,newnode,plist
From: https://blog.csdn.net/2305_78057683/article/details/140869853

相关文章

  • 独立站有多简单:电商新选择的轻松之道
    独立站的简易性体现在其自由度高、成本可控、易于搭建和运营的特点上。随着电商市场的不断成熟和消费者需求的多样化,独立站作为一种灵活、高效的电商模式,将为商家提供更多的发展机遇。希望通过本文的分析,能够帮助商家更好地认识和利用独立站,实现电商业务的快速增长和品牌价值的......
  • 关于一个简单的顺序表代码
    1.首先是头文件SeqList.h的代码:#pragmaonce#include<stdio.h>#include<assert.h>#include<stdlib.h>typedefintSXBint;typedefstructSL{ SXBint*a; intsize; intcapacity;}SLnode;//初始化voidSeqLsitInit(SLnode*ps);//尾插voidSeqPushback(S......
  • MySQL:初识数据库&初识SQL&创建数据库
    目录1、初识数据库1.1什么是数据库1.2 什么是MySQL2、数据库2.1 数据库服务&数据库2.2C/S架构3、初识SQL3.1什么是SQL3.2 SQL分类 4、使用SQL4.1查看所有数据库4.1.2语句解析 4.2创建数据库4.2.1 ifnotexists校验 4.2.2手动明确字符集和排序规......
  • .NET Core 8 部署在 IIS 的简单三步
    .NETCore8部署在IIS的简单三步.NET 部署 IIS 的简单步骤一:下载dotnet-hosting-x.y.z-win.exe,下载地址:.NETDownloads(Linux,macOS,andWindows)(microsoft.com) .NET 部署 IIS 的简单步骤二:选择对应的版本,点击进入详细页,如8.0的版本:版本最好和你......
  • 在服务器上使用Dockerfile创建springboot项目的镜像和踩坑避雷
    1.准备个文件夹这是我的路径/usr/local/springboot/docker-daka/docker_files2.将jar包上传springboot项目打包——maven的package这是整个项目打包的模式,也可以分离依赖、配置和程序进行打包,详情看我这篇文章:springboot依赖配置程序分离打包成jar包这里我以不......
  • [Oracle]面试官:你简单说说常用的4种约束
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18338278出自【进步*于辰的博客】参考笔记一,P22.18~22。目录1、介绍2、外键约束3、check约束4、notnull约束最后1、介绍“约束”是一种对数据表字段存储数据的限制,分......
  • 如何使用 Flask 或 Django 创建 Web 应用
     Flask和Django是Python中最受欢迎的两个Web框架,它们各有优点,适用于不同的应用场景。一、使用Flask创建Web应用1.1Flask简介Flask是一个轻量级的Web框架,以其简洁、易用和灵活著称。它遵循“微框架”的设计理念,只提供核心功能,其余的功能可以通过扩展和第三方库来实现。这使......
  • 创建xtrbackup备份用户 ERROR 1819 (HY000): Your password does not satisfy the cur
    查看密码策略mysql>SHOWVARIABLESLIKE'validate_password%';+--------------------------------------+--------+|Variable_name|Value|+--------------------------------------+--------+|validate_password_check_user_name......
  • Animate软件基础:“分散到图层”创建的新图层
    FlashASer:AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084FlashASer:实用的各种AdobeAnimate软件教程https://zhuanlan.zhihu.com/p/675680471FlashASer:Animate教程及作品源文件https://zhuanlan.zhihu.com/p/677437436FlashASer:Animate2022零......
  • ObjectARX 判断实体是否是在位编辑块对象简单例子
    判断使用acdbIsInLongTransaction应该就可以。ads_nameent;ads_pointpt;if(RTNORM!=acedEntSel(_T("\n选择对象:"),ent,pt)){return;}AcDbObjectIdobjId;acdbGetObjectId(objId,ent);//直接判断//if(acdbIsInLongTransaction......