头文件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 create();
//判空
int empty(doubleLoopPtr H);
//尾插
int insert_tail(doubleLoopPtr H,DataType e);
//遍历
void show(doubleLoopPtr H);
//尾删
int del_tail(doubleLoopPtr H);
//销毁
void free_doubleLoop(doubleLoopPtr H);
#endif
源文件doubleLoop.c
#include "doubleLoop.h"
//创建
doubleLoopPtr create()
{
//为链表头结点申请堆区空间
doubleLoopPtr H=(doubleLoopPtr)malloc(sizeof(doubleLoop));
//判断空间是否申请成功
if(NULL==H)
{
printf("fail create\n");
return NULL;
}
//申请空间成功,设置头结点初始值
H->len=0; //头结点数据域
H->next=H; //头结点的后继
H->prior=H; //头结点的前驱
printf("success create\n");
return H;
}
//判空
int empty(doubleLoopPtr H)
{
//判断接收的链表是否合法
if(NULL==H)
{
printf("fail empty\n");
return -1;
}
if(H->len=0||H->next==H||H->prior==H)
{
return 1;
}else
{
return 0;
}
}
//尾插
int insert_tail(doubleLoopPtr H,DataType e)
{
//判断接收的链表是否合法
if(NULL==H)
{
printf("fail insert_tail\n");
return 0;
}
//申请结点封装数据
doubleLoopPtr L=(doubleLoopPtr)malloc(sizeof(doubleLoop));
//为结点赋初始值
L->data=e;
//尾插结点指针域赋值,改变头结点的前驱结点的后继结点和头结点的前驱结点
L->prior=H->prior;
H->prior->next=L;
L->next=H;
H->prior=L;
//链表长度自增
H->len++;
printf("success insert_tail\n");
}
//遍历
void show(doubleLoopPtr H)
{
//判断接收的链表是否合法,判空
if(NULL==H||empty(H))
{
printf("fail show\n");
return;
}
printf("shoe doubleLoop:");
//定义遍历指针
doubleLoopPtr p=H;
while(p->next!=H)
{
p=p->next;
//输出数据域内容
printf("%d ",p->data);
}
putchar(10);
}
//尾删
int del_tail(doubleLoopPtr H)
{
//判断接收的链表是否合法,判空
if(NULL==H||empty(H))
{
printf("fail del_tail\n");
return 0;
}
//找到倒数第二个结点
doubleLoopPtr p=H->prior->prior;
//释放最后一个结点
free(H->prior);
//给倒数第二个结点和头结点搭桥
p->next=H;
H->prior=p;
//链表长度自减
H->len--;
printf("success del_tail\n");
return 1;
}
//销毁
void free_doubleLoop(doubleLoopPtr H)
{
//判断接收的链表是否合法
if(NULL==H)
{
printf("fail free_doubleLoop\n");
return;
}
//删除除了头结点之外的所有结点
while(H->next!=H)
{
del_tail(H);
}
//释放头结点
free(H);
H=NULL;
printf("success free_doubleLoop\n");
}
主函数文件main.c
#include "doubleLoop.h"
int main(int argc, const char *argv[])
{
//创建一个双向循环链表
doubleLoopPtr H=create();
//判空
printf("判空输出结果:%d\n",empty(H));
//尾插
insert_tail(H,1);
insert_tail(H,2);
insert_tail(H,3);
insert_tail(H,4);
insert_tail(H,5);
//遍历
show(H);
//尾删
del_tail(H);
show(H);
del_tail(H);
show(H);
//释放
free_doubleLoop(H);
return 0;
}
linux编译和运行指令
gcc *.c
./a.out
运行结果