一、双向循环链表的描述
和单链表的循环类似,双向链表也可以有循环表,循环表的引进是为了弥补双向链表不能向前遍历的弊端。
在双向循环链表中,头结点的直接前驱为尾结点,而尾结点的直接后继为头结点。
二、双向循环链表的存储结构
三、双向循环链表基本操作
3.1 双向循环链表创建
DoubleLink Request_space() //在堆区申请一个结点空间
{
DoubleLink node=(DoubleLink)malloc(sizeof(struct LNode));
if(NULL==node)
return NULL;
strcpy(node->data,"");
node->next=node;
node->prev=node;
return node;
}
3.2 双向循环链表遍历
int Output(DoubleLink L_list) //实现输出
{
if(NULL==L_list)
return -1;
DoubleLink p=L_list;
while(p->next!=L_list)
{
printf("%s ",p->data);
p=p->next;
}
printf("%s ",p->data);
puts("");
return 0;
}
3.3 双向循环链表头插
DoubleLink insert_head(DoubleLink L_list,ElemType value) //实现头插
{
DoubleLink node=Request_space();
if(NULL==node)
return L_list;
strcpy(node->data,value);
DoubleLink rear;
if(NULL!=L_list)
{
rear=L_list->prev;
node->next=L_list;
node->prev=rear;
L_list->prev=node;
rear->next=node;
}
L_list=node;
return L_list;
}
3.4 双向循环链表尾插
DoubleLink insert_rear(DoubleLink L_list,ElemType value) //实现尾插
{
DoubleLink node=Request_space();
strcpy(node->data,value);
if(NULL==L_list)
L_list=node;
else
{
DoubleLink rear=L_list->prev;
node->next=L_list;
node->prev=rear;
L_list->prev=node;
rear->next=node;
}
return L_list;
}
3.5 双向循环链表头删
DoubleLink delete_head(DoubleLink L_list) //实现头删
{
if(NULL==L_list)
return NULL;
if(L_list->next==NULL)
{
free(L_list);
L_list=NULL;
}
else
{
DoubleLink p=L_list->next;
strcpy(L_list->data,p->data);
L_list->next=p->next;
if(p->next!=L_list)
p->next->prev=L_list;
free(p);
p=NULL;
}
return L_list;
}
3.6 双向循环链表尾删
DoubleLink delete_rear(DoubleLink L_list) //实现尾删
{
if(NULL==L_list)
return NULL;
if(L_list->next==L_list)
{
free(L_list);
L_list=NULL;
}
else
{
DoubleLink rear=L_list->prev;
rear->prev->next=L_list;
L_list->prev=rear->prev;
free(rear);
rear=NULL;
}
return L_list;
}
四、多文件编辑实现基本操作
头文件 head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char ElemType[20]; //重定义数据域的数据类型
typedef struct LNode //定义双向循环链表存储结构
{
ElemType data;
struct LNode *next;
struct LNode *prev;
}*DoubleLink;
DoubleLink Request_space(); //在堆区申请一个结点空间
int Output(DoubleLink L_list); //实现输出
DoubleLink insert_head(DoubleLink L_list,ElemType value); //实现头插
DoubleLink insert_rear(DoubleLink L_list,ElemType value); //实现尾插
DoubleLink delete_head(DoubleLink L_list); //实现头删
DoubleLink delete_rear(DoubleLink L_list); //实现尾删
#endif
自定义函数 fun.c
#include "head.h"
DoubleLink Request_space() //在堆区申请一个结点空间
{
DoubleLink node=(DoubleLink)malloc(sizeof(struct LNode));
if(NULL==node)
return NULL;
strcpy(node->data,"");
node->next=node;
node->prev=node;
return node;
}
int Output(DoubleLink L_list) //实现输出
{
if(NULL==L_list)
return -1;
DoubleLink p=L_list;
while(p->next!=L_list)
{
printf("%s ",p->data);
p=p->next;
}
printf("%s ",p->data);
puts("");
return 0;
}
DoubleLink insert_head(DoubleLink L_list,ElemType value) //实现头插
{
DoubleLink node=Request_space();
if(NULL==node)
return L_list;
strcpy(node->data,value);
DoubleLink rear;
if(NULL!=L_list)
{
rear=L_list->prev;
node->next=L_list;
node->prev=rear;
L_list->prev=node;
rear->next=node;
}
L_list=node;
return L_list;
}
DoubleLink insert_rear(DoubleLink L_list,ElemType value) //实现尾插
{
DoubleLink node=Request_space();
strcpy(node->data,value);
if(NULL==L_list)
L_list=node;
else
{
DoubleLink rear=L_list->prev;
node->next=L_list;
node->prev=rear;
L_list->prev=node;
rear->next=node;
}
return L_list;
}
DoubleLink delete_head(DoubleLink L_list) //实现头删
{
if(NULL==L_list)
return NULL;
if(L_list->next==NULL)
{
free(L_list);
L_list=NULL;
}
else
{
DoubleLink p=L_list->next;
strcpy(L_list->data,p->data);
L_list->next=p->next;
if(p->next!=L_list)
p->next->prev=L_list;
free(p);
p=NULL;
}
return L_list;
}
DoubleLink delete_rear(DoubleLink L_list) //实现尾删
{
if(NULL==L_list)
return NULL;
if(L_list->next==L_list)
{
free(L_list);
L_list=NULL;
}
else
{
DoubleLink rear=L_list->prev;
rear->prev->next=L_list;
L_list->prev=rear->prev;
free(rear);
rear=NULL;
}
return L_list;
}
主函数 main.c
#include "head.h"
int main(int argc, const char *argv[])
{
DoubleLink L_list=NULL; //定义头指针变量,注意定义时一定要指向NULL
int n; //定义循环输入次数
ElemType value; //定义数据域元素
int seat; //定义元素位置
printf("please enter n:");
scanf("%d",&n);
for(int i=0;i<n;i++) //头插
{
printf("please enter a value:");
scanf("%s",value);
L_list=insert_head(L_list,value);
}
for(int i=0;i<n;i++) //尾插
{
printf("please enter a value:");
scanf("%s",value);
L_list=insert_rear(L_list,value);
}
L_list=delete_head(L_list); //头删
L_list=delete_rear(L_list); //尾删
Output(L_list);
return 0;
}