#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//循环双向链表
typedef struct DNode
{
int data; //值域
struct DNode *prev; //前驱指针
struct DNode *next; //后继指针
}Dnode, *DLinkList;
DLinkList Init_DLinkList(void); //初始化循环双向链表
DLinkList Creat_newNode(int DATA); //创建新节点,并赋值DATA
void Insert_head_DList(DLinkList DL, int DATA); //头插
void Delete_head_DList(DLinkList DL); //头删
void Insert_tail_DList(DLinkList DL, int DATA); //尾插
void Delete_tail_DList(DLinkList DL); //尾删
void Print_DList(DLinkList DL); //打印链表
bool Empty_DList(DLinkList DL); //判空
int Length_DList(DLinkList DL); //链表长度
void Destroy_DList(DLinkList DL); //销毁链表
DLinkList Init_DLinkList(void) //初始化循环双向链表
{
DLinkList head = malloc(sizeof(Dnode));
if(head != NULL)
{
head -> prev = head;
head -> next = head;
head -> data = -1;
return head;
}
else
{
printf("初始化失败!\n");
return 0;
}
}
DLinkList Creat_newNode(int DATA) //创建新节点,并赋值DATA
{
DLinkList newnode = malloc(sizeof(Dnode));
if(newnode != NULL)
{
newnode -> prev = newnode;
newnode -> next = newnode;
newnode -> data = DATA;
return newnode;
}
else
{
printf("创建失败!\n");
return 0;
}
}
void Insert_head_DList(DLinkList DL, int DATA) //头插
{
DLinkList newnode = Creat_newNode(DATA);
newnode -> prev = DL;
newnode -> next = DL -> next;
DL -> next = newnode;
newnode -> next -> prev = newnode;
}
void Delete_head_DList(DLinkList DL) //头删
{
if(Empty_DList(DL) == 1) //链表为空
{
printf("链表为空,无法删除!\n");
}
else
{
DLinkList p = DL -> next;
p -> next -> prev = DL;
DL -> next = p -> next;
printf("要删除的数据为:%d\n", p -> data);
free(p);
}
}
void Insert_tail_DList(DLinkList DL, int DATA) //尾插
{
DLinkList newnode, tail;
tail = DL -> prev; //tail先指向尾节点
newnode = Creat_newNode(DATA); //创建一个新节点
newnode -> prev = tail; //不可变
tail -> next = newnode; //可以和下一句调换位置
newnode -> next = DL; //可以和上一句调换位置
DL -> prev = newnode; //不可变
}
void Delete_tail_DList(DLinkList DL) //尾删
{
if(Empty_DList(DL) == 1) //链表为空
{
printf("链表为空,无法删除!\n");
}
else
{
DLinkList tail = DL -> prev; //tail先指向尾节点
tail -> prev -> next = DL;
DL -> prev = tail -> prev;
printf("要删除的数据为:%d\n", tail -> data);
free(tail);
}
}
void Print_DList(DLinkList DL) //打印链表
{
if(Empty_DList(DL) == 1) //链表为空
{
printf("链表为空!\n");
}
else
{
DLinkList p = DL -> next;
while(p != DL)
{
if(p -> next != DL)
{
printf("%d ---> ", p -> data);
}
else
{
printf("%d\n", p -> data);
}
p = p -> next;
}
}
}
bool Empty_DList(DLinkList DL) //判空
{
if(DL -> next == DL || DL -> prev == DL)
{
return true; // 1
}
else
{
return false; // 0
}
}
int Length_DList(DLinkList DL) //链表长度
{
if(Empty_DList(DL) == 1)
{
return 0;
}
else
{
DLinkList p = DL;
int length = 0;
while(p -> next != DL)
{
length ++;
p = p -> next;
}
return length;
}
}
void Destroy_DList(DLinkList DL) //销毁链表
{
if(Empty_DList(DL) != 1)
{
DLinkList p = DL;
while(p -> next != DL || p -> prev != DL) //循环头删
{
Delete_head_DList(DL);
p = p -> next;
}
printf("free:%d\n", p -> data);
free(p);
free(DL);
}
else
{
free(DL);
}
}
int main()
{
DLinkList DL = Init_DLinkList();
for(int i = 1; i<=5; i++)
{
// Insert_tail_DList(DL, i); //尾插
Insert_head_DList(DL, i); //头插
}
Print_DList(DL); //打印链表
printf("length:\t%d\n",Length_DList(DL)); //链表长度
Delete_head_DList(DL); //头删
Print_DList(DL);
printf("length:\t%d\n",Length_DList(DL));
Delete_tail_DList(DL); //尾删
Print_DList(DL);
printf("length:\t%d\n",Length_DList(DL));
Destroy_DList(DL); //销毁链表
Print_DList(DL);
}
结果: