双向循环链表
一、笔记:
源文件中的两个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;
}
测试结果:

浙公网安备 33010602011771号