【数据结构】双向链表

尾插图解

中间插入图解

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;
}
相关推荐
遇见尚硅谷5 小时前
C语言:20250712笔记
c语言·开发语言·数据结构
404未精通的狗5 小时前
(数据结构)复杂度
数据结构
二进制person5 小时前
数据结构--准备知识
java·开发语言·数据结构
仟濹6 小时前
【数据结构】栈与链表的区别
数据结构·链表
秋说7 小时前
【PTA数据结构 | C语言版】阶乘的递归实现
c语言·数据结构·算法
小指纹8 小时前
巧用Bitset!优化dp
数据结构·c++·算法·代理模式·dp·bitset
2301_8167431113 小时前
Java-数构链表
java·开发语言·链表
努力写代码的熊大18 小时前
随机链表的复制数据结构oj题(力口138)
数据结构·链表
Am心若依旧40919 小时前
C++设计模式之创建型模式
java·开发语言·数据结构·c++·设计模式