双向链表基本操作及顺序和链表总结

目录

基本函数实现

链表声明

总的函数实现声明

创建一个节点

初始化链表

打印

尾插

尾删

头插

头删

查找

pos前插入

删除pos位置

销毁链表

顺序表和链表总结


基本函数实现

链表声明

cpp 复制代码
typedef int DLTDataType;

typedef struct DListNode
{
	struct DListNode* next;
	struct DListNode* prev;
	DLTDataType val;
}DLTNode;

总的函数实现声明

cpp 复制代码
//申请新的节点
DLTNode* CreateLTNode(DLTDataType x);
//初始化
DLTNode* DLTInit();
//打印
void DLTPrint(DLTNode* phead);
//头插头删尾插尾删
void DLTPushBack(DLTNode* phead, DLTDataType x);
void DLTPopBack(DLTNode* phead);
void DLTPushFront(DLTNode* phead, DLTDataType x);
void DLTPopFront(DLTNode* phead);
//找x的位置
DLTNode* DLTFind(DLTNode* phead, DLTDataType x);
//在pos前面插入
void DLTInsert(DLTNode* pos, DLTDataType x);
//删除pos位置
void DLTErase(DLTNode* pos);
//销毁链表
void DLTDestroy(DLTNode* phead);

创建一个节点

cpp 复制代码
DLTNode* CreateLTNode(DLTDataType x)
{
	DLTNode* newnode = (DLTNode*)malloc(sizeof(DLTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->val = x;
	newnode->prev = NULL;
	newnode->next = NULL;
	return newnode;
}

初始化链表

cpp 复制代码
DLTNode* DLTInit()
{
	DLTNode* phead = CreateLTNode(-1);
	phead->next = phead;
	phead->prev = phead;
	return phead;
}

打印

cpp 复制代码
void DLTPrint(DLTNode* phead)
{
	assert(phead);
	printf("哨兵卫<=>");

	DLTNode* cur = phead->next;
	while (cur != phead)
	{
		printf("%d<=>", cur->val);
		cur = cur->next;
	}
	printf("\n");
}

尾插

cpp 复制代码
//第一种尾插方式
//void DLTPushBack(DLTNode* phead, DLTDataType x)
//{
//	assert(phead);
//	DLTNode* tail = phead->prev;
//	DLTNode* newnode = CreateLTNode(x);
//
//	tail->next = newnode;
//	newnode->prev = tail;
//	newnode->next = phead;
//	phead->prev = newnode;
//}

//第二种尾插方式
void DLTPushBack(DLTNode* phead, DLTDataType x)
{
	assert(phead);
	DLTInsert(phead, x);
}

尾删

cpp 复制代码
//第一种尾删
//void DLTPopBack(DLTNode* phead)
//{
//	assert(phead);
//	assert(phead->next != phead);
//
//	DLTNode* tail = phead->prev;
//	DLTNode* tailPrev = tail->prev;
//	free(tail);
//	tailPrev->next = phead;
//	phead->prev = tailPrev;
//}

//第二种尾删
void DLTPopBack(DLTNode* phead)
{
	assert(phead);
	assert(phead->next != phead);
	
	DLTErase(phead->prev);
}

头插

cpp 复制代码
//第一种头插方式
//void DLTPushFront(DLTNode* phead, DLTDataType x)
//{
//	assert(phead);
//	DLTNode* newnode = CreateLTNode(x);
//
//	newnode->next = phead->next;
//	phead->next->prev = newnode;
//	phead->next = newnode;
//	newnode->prev = phead;
//}

//第二种头插方式
//void DLTPushFront(DLTNode* phead, DLTDataType x)
//{
//	assert(phead);
//	DLTNode* newnode = CreateLTNode(x);
//	DLTNode* first = phead->next;
//
//	phead->next = newnode;
//	newnode->prev = phead;
//	newnode->next = first;
//	first->prev = newnode;
//}

//第三种头插方式
void DLTPushFront(DLTNode* phead, DLTDataType x)
{
	assert(phead);
	
	DLTInsert(phead->next, x);
}

头删

cpp 复制代码
第一种头删
//void DLTPopFront(DLTNode* phead)
//{
//	assert(phead);
//	assert(phead->next != phead);
//
//	DLTNode* first = phead->next;
//	DLTNode* second = first->next;
//	phead->next = second;
//	second->prev = phead;
//	free(first);
//	first = NULL;
//}

//第二种头删
void DLTPopFront(DLTNode* phead)
{
	assert(phead);
	assert(phead->next != phead);

	DLTErase(phead->next);
}

查找

cpp 复制代码
DLTNode* DLTFind(DLTNode* phead, DLTDataType x)
{
	assert(phead);

	DLTNode* cur = phead->next;
	while (cur != phead)
	{
		if (cur->val == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

pos前插入

cpp 复制代码
//在pos前面插入
void DLTInsert(DLTNode* pos, DLTDataType x)
{
	assert(pos);

	DLTNode* posPrev = pos->prev;
	DLTNode* newnode = CreateLTNode(x);

	posPrev->next = newnode;
	newnode->prev = posPrev;
	newnode->next = pos;
	pos->prev = newnode;
}

删除pos位置

cpp 复制代码
//删除pos位置
void DLTErase(DLTNode* pos)
{
	assert(pos);

	DLTNode* posNext = pos->next;
	DLTNode* posPrev = pos->prev;

	posPrev->next = posNext;
	posNext->prev = posPrev;
	free(pos);
	pos = NULL;
}

销毁链表

cpp 复制代码
void DLTDestroy(DLTNode* phead)
{
	assert(phead);

	DLTNode* cur = phead->next;
	while (cur != phead)
	{
		DLTNode* next = cur->next;
		free(cur);
		cur = next;
	}
	free(phead);
}

顺序表和链表总结

上方的链表指的是双向链表,顺序表指的是数组顺序表。

相关推荐
特立独行的猫a1 小时前
Windows安装Rust环境 Clang替代GCC MinGW环境LLVM工具链(详细教程)
开发语言·windows·rust·mingw·环境搭建·llvm
m0_720245017 小时前
1543.统计好三元组(简单)
开发语言·算法
叠层归一研究院9 小时前
AGI 系统(八):符号范畴嵌入函子 — SymCat ↪ C_M107 严格化
c语言·开发语言·人工智能·算法·transformer·agi
明朝百晓生9 小时前
Deep RL learning[2026/8]
开发语言·javascript·人工智能
weixin-a1530030831610 小时前
python-装饰器
开发语言·python
我的xiaodoujiao10 小时前
快速学习Python基础知识详细图文教程17--类型注解和断点调试
开发语言·python·学习·测试工具
wabs66611 小时前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
leoZ23112 小时前
AI 辅助开发的五道坎
开发语言·人工智能·视觉检测·bert·php·超分辨率重建·openvino
imaol112 小时前
链表 -- 环链表
java·前端·链表
wuyk55512 小时前
2.队列:先进先出的线性数据结构
c语言·数据结构·stm32·单片机