【数据结构】双向链表

尾插图解

中间插入图解

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;
}
相关推荐
hn小菜鸡2 小时前
LeetCode 2540.最小公共值
数据结构·算法·leetcode
Z_z在努力3 小时前
【数据结构】List 详解
数据结构·list
神龙斗士2405 小时前
Java 数组的定义与使用
java·开发语言·数据结构·算法
Z_z在努力6 小时前
【数据结构】队列(Queue)全面详解
java·开发语言·数据结构
岑梓铭6 小时前
《考研408数据结构》第二章《线性表(顺序表、链表)》复习笔记
数据结构·笔记·考研
日落辞朝阳9 小时前
数据结构——顺序表
数据结构
Z_z在努力9 小时前
【数据结构】哈希表(Hash Table)详解
数据结构·哈希算法·散列表
MMjeaty10 小时前
数据结构——栈和队列
数据结构·算法
瓜瓜怪兽亚10 小时前
前端基础知识---10 Node.js(三)
数据结构·数据库·node.js
古译汉书15 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发