定义节点结构体
节点结构体分为数据域、前指针域和后指针域,其中指针域的类型为当前结构体指针,前指针域指向前一个节点的地址,后指针域保存后一个节点的地址
将节点结构体取别名,方便后续编写程序
创建一个空的双向循环链表
定义一个结构体变量,在堆区用malloc开辟空间,注意进行数据类型转换
头结点的前指针域指向头结点
头结点的后指针域指向头结点
返回头节点
插入数据
定义一个指针变量1,用malloc在堆区开辟空间,注意要进行数据类型转换
给指针变量的数据域赋值
再定义一个指针变量2指向Head的下一个
指针1的下一个指向指针2
指针2的上一个指向指针1
指针1的上一个指向Head
Head的下一个指向指针1
遍历链表
定义一个指针变量指向Head
当指针的下一个不为Head时(即进行第一次向后循环遍历)
双向循环链表从Head开始一个个向后偏移
并且打印每一个节点的数据域
当指针的上一个不为Head时(即进行第一次向前循环遍历)
双向循环链表从Head开始一个个向后偏移
并且打印每一个节点的数据域
打印每一个节点的数据域
并且双向循环链表从Head开始一个个向后偏移
删除数据
首先判断Head的下一个是不是本身(即判断双向循环链表是否为空)
如果是,打印链表为空的提示信息
返回-1
定义指针变量保存要删除的节点的地址(即Head的下一个)
Head的下一个指向要删除的节点的下一个
要删除的节点的下一个的上一个指向Head
定义一个变量保存要删除的变量的指针域
释放定义的指针变量
将释放的指针变量指向空
返回删除的节点的数据域的数据
源码
为方便对照,贴出源码
doublelist.h
#ifndef _DOUBLELIST_H_
#define _DOUBLELIST_H_
#include <stdio.h>
#include <stdlib.h>
//定义数据类型
typedef int DataType;
//定义结点结构体
typedef struct node{
DataType data;
struct node *front; //保存前一个结点的地址
struct node *next; //保存后一个结点的地址
}doublelist;
//创建一个空的双向循环链表
doublelist *DoublelistCreate();
//插入数据
void DoulelistInsert(doublelist *Head, DataType value);
//遍历链表
void DoublelistPrint(doublelist *Head);
#endif
doublelist.c
#include "doublelist.h"
//创建一个空的双向循环链表
doublelist *DoublelistCreate()
{
//在堆区开辟空间
doublelist *Head = (doublelist *)malloc(sizeof(doublelist));
//让头结点的两个指针保存头结点的地址
Head->front = Head;
Head->next = Head;
return Head;
}
//插入数据
void DoulelistInsert(doublelist *Head, DataType value)
{
doublelist *temp = (doublelist *)malloc(sizeof(doublelist));
temp->data = value;
doublelist *pnew = Head->next;
temp->next = pnew;
pnew->front = temp;
temp->front = Head;
Head->next = temp;
}
//遍历链表
void DoublelistPrint(doublelist *Head)
{
doublelist *p = Head;
while(Head->next != p)
{
Head = Head->next;
printf("%d ", Head->data);
}
putchar(10);
while(Head->front != p)
{
printf("%d ", Head->data);
Head = Head->front;
}
printf("%d ", Head->data);
putchar(10);
}
main.c
#include "doublelist.h"
int main(int argc, char const *argv[])
{
doublelist *h = DoublelistCreate();
DoulelistInsert(h, 100);
DoulelistInsert(h, 200);
DoulelistInsert(h, 300);
DoulelistInsert(h, 400);
DoulelistInsert(h, 500);
DoulelistInsert(h, 600);
DoublelistPrint(h);
return 0;
}