实现双向循环链表

发布于:2025-09-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

双向循环链表

本文章将展示zack实现双向循环链表的代码

// list.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int data_type;
typedef struct list_node
{
	data_type data;
	struct list_node* next;
	struct list_node* prve;
}list_node;

list_node* buy_node(data_type x);

void list_init(list_node** pphead);

void list_print(list_node* phead);

void list_push_back(list_node* phead, data_type x);

void list_push_front(list_node* phead, data_type x);

bool list_empty(list_node* phead);

void list_pop_back(list_node* phead);

void list_pop_front(list_node* phead);

list_node* list_find(list_node* phead, data_type x);

// 在指定位置之前插入
void list_insert(list_node* pos, data_type x);

void list_erase(list_node* pos);

void list_destroy(list_node** pphead);
// list.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"list.h"

list_node* buy_node(data_type x)
{
	list_node* new_node = (list_node*)malloc(sizeof(list_node));
	if (new_node == NULL)
	{
		perror("malloc fail");
		exit(1);
	}
	new_node->data = x;
	new_node->next = new_node->prve = new_node;
	return new_node;
}

void list_init(list_node** pphead)
{
	*pphead = buy_node(-1);
}

void list_print(list_node* phead)
{
	list_node* pcur = phead->next;
	while (pcur != phead)
	{
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("\n");
}

void list_push_back(list_node* phead, data_type x)
{
	assert(phead);
	list_node* new_node = buy_node(x);
	new_node->next = phead;
	new_node->prve = phead->prve;
	phead->prve->next = new_node;
	phead->prve = new_node;
}

void list_push_front(list_node* phead, data_type x)
{
	assert(phead);
	list_node* new_node = buy_node(x);
	new_node->next = phead->next;
	new_node->prve = phead;
	phead->next->prve = new_node;
	phead->next = new_node;
}

bool list_empty(list_node* phead)
{
	assert(phead);
	return phead->next == phead;
}

void list_pop_back(list_node* phead)
{
	list_empty(phead);
	assert(phead);
	list_node* del = phead->prve;
	phead->prve->prve->next = phead;
	phead->prve = phead->prve->prve;
	free(del);
	del = NULL;
}

void list_pop_front(list_node* phead)
{
	list_empty(phead);
	assert(phead);
	list_node* del = phead->next;
	phead->next->next->prve = phead;
	phead->next = phead->next->next;
	free(del);
	del = NULL;
}

list_node* list_find(list_node* phead, data_type x)
{
	list_node* pcur = phead->next;
	while (pcur != phead)
	{
		if (pcur->data == x)
			return pcur;
		pcur = pcur->next;
	}
	return NULL;
}

void list_insert(list_node* pos, data_type x)
{
	assert(pos);
	list_node* new_node = buy_node(x);
	new_node->next = pos;
	new_node->prve = pos->prve;
	pos->prve->next= new_node;
	pos->prve = new_node;
}

void list_erase(list_node* pos)
{
	assert(pos);
	pos->prve->next = pos->next;
	pos->next->prve = pos->prve;
	free(pos);
	pos = NULL;
}

void list_destroy(list_node** pphead)
{
	assert(pphead && *pphead);
	list_node* pcur = (*pphead)->next;
	while (pcur != *pphead)
	{
		list_node* del = pcur;
		pcur = pcur->next;
		free(del);
		del = NULL;
	}
	free(*pphead);
	*pphead = NULL;
	pcur = NULL;
}
// test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"list.h"

void list_test01()
{
	list_node* plist;
	list_init(&plist); // 这里是传哨兵位的地址,因为plist的指向发生改变
	list_push_back(plist, 1);
	list_push_back(plist, 2);
	list_push_back(plist, 3);
	list_push_back(plist, 4);
	list_push_back(plist, 5);
	list_print(plist);
	list_push_front(plist, 5);
	list_push_front(plist, 4);
	list_push_front(plist, 3);
	list_push_front(plist, 2);
	list_print(plist);
}

void list_test02()
{
	list_node* plist;
	list_init(&plist);
	list_push_back(plist, 1);
	list_push_back(plist, 2);
	list_push_back(plist, 3);
	list_push_back(plist, 4);
	list_print(plist);
	list_pop_back(plist);
	list_print(plist);
	list_pop_back(plist);
	list_print(plist);
	list_pop_back(plist);
	list_print(plist);
	list_pop_back(plist);
	list_print(plist);
}

void list_test03()
{
	list_node* plist;
	list_init(&plist);
	list_push_back(plist, 1);
	list_push_back(plist, 2);
	list_push_back(plist, 3);
	list_push_back(plist, 4);
	list_print(plist);
	list_pop_front(plist);
	list_print(plist);
	list_pop_front(plist);
	list_print(plist);
	list_pop_front(plist);
	list_print(plist);
}

void list_test04()
{
	list_node* plist;
	list_init(&plist);
	list_push_back(plist, 1);
	list_push_back(plist, 2);
	list_push_back(plist, 3);
	list_push_back(plist, 4);
	list_print(plist);
	list_node* pos = list_find(plist, 1);
	list_insert(pos, 22);
	list_print(plist);
	pos = list_find(plist, 22);
	list_erase(pos);
	list_print(plist);
	list_destroy(&plist);
}
int main()
{
	//list_test01();
	//list_test02();
	//list_test03();
	list_test04();
	return 0;
}