双向循环链表

一、笔记:
源文件中的两个static方法体现了双向循环链表的核心思想,只要找到前驱节点、后继节点,增加和删除就很好执行
对于循环,终止的条件是指针不指向链表头,链表头和普通节点的结构是一样的,只不过里面的val值没有啥用处,也可以记录该链表节点的数量,
查找某一节点的时候循环是从表头指向的头结点开始的
一开始,表头的前驱和后继都是指向自己
二、头文件doubleLoopList.h:

#pragma once
typedef int Element_t;

typedef struct d_node {
	Element_t val;
	struct d_node* prev;
	struct d_node* next;
}DNode_t,DLinkHeader_t;

//双向循环链表的头建议是自己维护,表头放在栈上,放在全局变量
void initDLinkHeader(DLinkHeader_t* header);
//插入:头插、尾插
void insertDLinkHeader(DLinkHeader_t* header, Element_t val);
void insertDLinkRear(DLinkHeader_t* header, Element_t val);
//遍历双向循环链表
void showDLink(const DLinkHeader_t* header);
//删除元素
void delNode(DLinkHeader_t* header, Element_t val);

三、源文件doubleLoopList.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"doubleLoopList.h"

void initDLinkHeader(DLinkHeader_t* header) {
	header->prev = header;
	header->next = header;
	header->val = 0;
}
static void addNode(DNode_t *prev,DNode_t *new_node,DNode_t *next) {
	next->prev = new_node;
	new_node->next = next;
	new_node->prev = prev;
	prev->next = new_node;
}
static void delDnode(DNode_t* prev, DNode_t* next) {
	next->prev = prev;
	prev->next = next;
}
void insertDLinkHeader(DLinkHeader_t* header, Element_t val) {
	DNode_t* new_node = malloc(sizeof(DNode_t));
	new_node->val = val;
	addNode(header, new_node, header->next);
}
void insertDLinkRear(DLinkHeader_t* header, Element_t val) {
	DNode_t* new_node = malloc(sizeof(DNode_t));
	new_node->val = val;
	addNode(header->prev, new_node, header);
}
void showDLink(const DLinkHeader_t* header) {
	//从头往前走或从头往后走
	DNode_t* pos = header->next;
	while (pos != header) {
		printf("%d\t", pos->val);
		pos = pos->next;
	}
	printf("\n");
}
void delNode(DLinkHeader_t* header, Element_t val) {
	//1.先找到这个元素
	DNode_t* pos = header->next;
	while (pos!=header) {
		if (pos->val == val) {
			break;
		}
		pos = pos->next;
	}
	//2.进行删除操作,判断退出循环的原因
	if (pos == header) {
		printf("not find %d!\n",val);
	}
	else {
		delDnode(pos->prev, pos->next);
		free(pos);
	}
}

四、测试文件main.c:

#include"doubleLoopList.h"

//全局变量
DLinkHeader_t header;
void test01() {
	initDLinkHeader(&header);
	for (int i = 0; i < 5; i++) {
		insertDLinkHeader(&header, i + 100);
	}
	insertDLinkHeader(&header, 500);
	showDLink(&header);
	printf("**********************************\n");
	delNode(&header, 103);
	delNode(&header, 105);
	showDLink(&header);
	printf("**********************************\n");
}

int main() {
	test01();
	return 0;
}

测试结果:
image

posted @ 2026-02-04 09:00  f-52Hertz  阅读(6)  评论(0)    收藏  举报