概念
相关操作
2.1定义结点结构体
//定义结点结构体
typedef struct node{
DataType data;
struct node *front; //保存前一个结点的地址
struct node *next; //保存后一个结点的地址
}doublelist;
2.2创建一个空的双向循环链表
//创建一个空的双向循环链表
doublelist *DoublelistCreate()
{
//在堆区开辟空间
doublelist *Head = (doublelist *)malloc(sizeof(doublelist));
//让头结点的两个指针保存头结点的地址
Head->front = Head;
Head->next = Head;
return Head;
}
2.3插入数据
//插入数据
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;
}
2.4遍历链表
//遍历链表
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);
}
2.5删除数据
//删除数据
DataType DoublelistDelete(doublelist *Head)
{
if(Head->next == Head)
{
printf("链表为空\n");
return (DataType)-1;
}
//定义变量保存要删除的结点的地址
doublelist *temp = Head->next;
Head->next = temp->next;
temp->next->front = Head;
DataType value = temp->data;
free(temp);
temp = NULL;
return value;
}
相关代码
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;
}
双向循环链表头删法删除数据
//删除数据
DataType DoublelistDelete(doublelist *Head)
{
if(Head->next == Head)
{
printf("链表为空\n");
return (DataType)-1;
}
//定义变量保存要删除的结点的地址
doublelist *temp = Head->next;
Head->next = temp->next;
temp->next->front = Head;
DataType value = temp->data;
free(temp);
temp = NULL;
return value;
}