【数据结构】双向链表

尾插图解

中间插入图解

List.h代码

复制代码
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int LTDataType;

typedef struct ListNode
{
	struct ListNode* next;
	struct ListNode* prev;//头节点

	LTDataType data;
}LTNode;

LTNode*LTInit();
void LTDestroy(LTNode* phead);
LTNode* LTFind(LTNode* phead, LTDataType x);

void LTPushFront(LTNode* phead, LTDataType x);
void LTPopFront(LTNode* phead);
void LTPushBack(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);
void LTInsert(LTNode* pos, LTDataType x);//在pos位置之前插入一个值
void LTErase(LTNode* pos);//删除pos

void LTPrint(LTNode* phead);
bool LTEmpty(LTNode* phead);//判断一个双向链表是否为空(删除时要判断)

List.c代码

复制代码
#include "List.h"

LTNode* BuyListNode(LTDataType x)
{
	LTNode* node = (LTNode*)malloc(sizeof(LTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	node->next = NULL;
	node->prev = NULL;
	node->data = x;
	return node;
}


void LTPrint(LTNode* phead)
{
	assert(phead);

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


bool LTEmpty(LTNode* phead)
{
	assert(phead);
	return phead->next == phead;
}


LTNode* LTInit()
{
	LTNode* phead = BuyListNode(-1);
	phead->next = phead;
	phead->prev = phead;
	return phead;
}


void LTDestroy(LTNode* phead)
{
	assert(phead);
	LTNode* cru = phead->next;
	while (cru != phead)
	{
		LTNode* next = cru->next;
		free(cru);
		cru = next;
	}
	free(phead);
}


LTNode* LTFind(LTNode* phead, LTDataType x)
{
	assert(phead);
	LTNode* cur = phead->next;
	while (cur != phead)
	{
		if (cur->data == x)
			return cur;
		cur = cur->next;
	}
	return NULL;
}


void LTPushFront(LTNode* phead, LTDataType x)
{
	assert(phead);
	LTNode* newnode = BuyListNode(x);
	LTNode* first = phead->next;

	newnode->prev = phead;
	newnode->next = first;
	phead->next = newnode;
	first->prev = newnode;

}


void LTPopFront(LTNode* phead)
{
	assert(phead);
	assert(!LTEmpty(phead));

	LTNode* pphead = phead->next;
	LTNode* first = pphead->next;

	phead->next = first;
	first->prev = phead;
	free(pphead);
	pphead = NULL;
}


void LTPushBack(LTNode* phead, LTDataType x)
{
	assert(phead);

	LTNode* newnode = BuyListNode(x);
	LTNode* tail = phead->prev;

	newnode->prev = tail;
	newnode->next = phead;
	phead->prev = newnode;
	tail->next = newnode;
}


void LTPopBack(LTNode* phead)
{
	assert(phead);
	assert(!LTEmpty(phead));

	LTNode* tail = phead->prev;
	LTNode* tailPrev = tail->prev;

	tailPrev->next = phead;
	phead->prev = tailPrev;
	free(tail);
	tail = NULL;
}

void LTInsert(LTNode* pos, LTDataType x)
{
	assert(pos);
	LTNode* prev = pos->prev;
	LTNode* newnode = BuyListNode(x);

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


void LTErase(LTNode* pos)
{
	assert(pos);
	LTNode* prev = pos->prev;
	LTNode* next = pos->next;

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

Test.c代码

复制代码
#include "List.h"

void TestList1()
{
	LTNode* plist = LTInit();
	LTPushBack(plist, 1);
	LTPushBack(plist, 2);
	LTPushBack(plist, 3);
	LTPushBack(plist, 4);
	LTPrint(plist);

	LTPopBack(plist);
	LTPrint(plist);

	LTPushFront(plist, 0);
	LTPushFront(plist, 1);
	LTPushFront(plist, 2);
	LTPushFront(plist, 3);
	LTPrint(plist);

	LTPopFront(plist);
	LTPrint(plist);

}

TestList2()
{
	LTNode* plist = LTInit();
	LTPushBack(plist, 1);
	LTPushBack(plist, 2);
	LTPushBack(plist, 3);
	LTPushBack(plist, 4);
	LTPrint(plist);

	LTNode* pos = LTFind(plist, 3);
	if (pos)
	{
		/*LTErase(pos);
		pos = NULL;*/
		LTInsert(pos, 10);
	}
	LTPrint(plist);
}

TestList3()
{
	LTNode* plist = LTInit();
	LTPushBack(plist, 1);
	LTPushBack(plist, 2);
	LTPushBack(plist, 3);
	LTPushBack(plist, 4);
	LTPrint(plist);
	LTDestroy(plist);
	plist = NULL;
}
int main()
{
	//TestList1();
	//TestList2();
	TestList3();
	return 0;
}
相关推荐
j_xxx404_6 小时前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺6 小时前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
野犬寒鸦7 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
一枝小雨7 小时前
【OJ】C++ vector类OJ题
数据结构·c++·算法·leetcode·oj题
自信的小螺丝钉7 小时前
Leetcode 206. 反转链表 迭代/递归
算法·leetcode·链表
豆沙沙包?9 小时前
2025年- H118-Lc86. 分隔链表(链表)--Java版
java·数据结构·链表
得意霄尽欢10 小时前
Redis之核心数据结构浅析
数据结构·redis
DashingGuy11 小时前
算法(keep learning)
java·数据结构·算法
田里的水稻11 小时前
C++_数据类型和数据结构
java·数据结构·c++
兔兔西11 小时前
【数据结构、java学习】数组(Array)
java·数据结构·算法