1> 思维导图
2> 实现双向循环链表的 创建、判空、尾插、遍历、尾删、销毁
doubleLoop.h
#ifndef __DOUBLELOOP_H__
#define __DOUBLELOOP_H__
#include<stdio.h>
#include<stdlib.h>
//类型重定义,用于存储数据的类型
typedef int DataType;
//定义一个节点的结构体类型
typedef struct Node
{
union
{
int len;
DataType data;
};
struct Node *next;
struct Node *prior;
}doubleLoop,*doubleLoopPtr;
doubleLoopPtr link_create();//创建链表
int empty(doubleLoopPtr H);//判空
doubleLoopPtr create_node(DataType e);//申请节点
int tail_add(doubleLoopPtr H,DataType e);//尾插
void show(doubleLoopPtr H);//遍历
int tail_del(doubleLoopPtr H);//尾删
void free_list(doubleLoopPtr H);//销毁链表
#endif
doubleLoop.c
#include"doubleLoop.h"
doubleLoopPtr link_create()//创建链表
{
//申请堆区空间
doubleLoopPtr H = (doubleLoopPtr)malloc(sizeof(doubleLoop));
if(NULL == H)
{
printf("创建失败!\n");
return NULL;
}
H->len = 0;
H->next = H;
H->prior = H;
printf("创建双向循环列表成功!\n");
return H;
}
int empty(doubleLoopPtr H)//判空
{
if(NULL == H)
{
printf("判空失败!\n");
return -1;
}
return H->len == 0;
}
doubleLoopPtr create_node(DataType e)//申请节点
{
//申请节点空间
doubleLoopPtr p = (doubleLoopPtr)malloc(sizeof(doubleLoop));
if(NULL == p)
{
printf("申请失败!\n");
return NULL;
}
p->data = e;
p->prior = NULL;
p->next = NULL;
return p;
}
int tail_add(doubleLoopPtr H,DataType e)//尾插
{
if(NULL == H)
{
printf("尾插失败!\n");
return 0;
}
doubleLoopPtr p = create_node(e);//新节点
doubleLoopPtr q = H->prior;
q->next = p;//前一个节点指向新节点
p->prior = q;//新节点的前驱指向上一个节点
p->next = H;//新节点的下一个节点指向头结点
H->prior = p;//头结点前驱指向新节点
H->len++;
return 1;
}
//遍历
void show(doubleLoopPtr H)
{
if(NULL == H || empty(H))
{
printf("遍历失败!\n");
return;
}
doubleLoopPtr p = H;
for(int i=0;i<H->len;i++)
{
p = p->next;
printf("%d ",p->data);
}
printf("\n");
}
int tail_del(doubleLoopPtr H)//尾删
{
if(NULL == H || empty(H))
{
printf("尾删失败\n");
return 0;
}
doubleLoopPtr p = H->prior;//定义一个指针指向最后一个节点
doubleLoopPtr q = p->prior;//定义一个指针指向倒数第二个节点
free(p);//删除最后一个节点
q->next = H;
H->prior = q;
H->len--;
return 1;
}
void free_list(doubleLoopPtr H)//销毁链表
{
if(NULL == H)
{
printf("销毁失败!\n");
return;
}
while(H->next != H)
{
tail_del(H);
}
free(H);
H = NULL;
printf("销毁成功!\n");
}
main.c
#include"doubleLoop.h"
int main()
{
doubleLoopPtr H = link_create();
tail_add(H,10);
tail_add(H,20);
tail_add(H,30);
tail_add(H,40);
tail_add(H,50);
show(H);
tail_del(H);
show(H);
free_list(H);
H=NULL;
}
运行截图