一、代码如下
/*
项目名称:双向循环链表的建立与基本操作
编译环境:VC++ 2008
作者相关:。。。
最后修改:2019.6.19
学习目标:判空、求长、获取元素位置、返回某个位置的元素、插入元素、删除元素、清空链表、销毁链表
注意事项:1.测试所有功能是否正常
*/
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE true
#define FALSE false
typedef int ElemType;
typedef bool Status;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
Status Create_DuLNode(DuLinkList *L);
Status Init_DuL(DuLinkList *L);
Status Empty_DuL(DuLinkList L);
int Length_DuL(DuLinkList L);
Status Insert_DuL(DuLinkList *L,int i,ElemType e);
Status GetElem_DuL(DuLinkList L,int i,ElemType *e);
int Locate_DuL(DuLinkList L,ElemType e);
Status Delete_DuL(DuLinkList *L,int i,ElemType *e);
Status Clear_DuL(DuLinkList *L);
Status Destroy_DuL(DuLinkList *L);
void Out_List(DuLinkList L);
int main()
{
DuLinkList L1;
ElemType e;
Create_DuLNode(&L1);
Init_DuL(&L1);
if(Empty_DuL(L1))
printf("双向循环链表为空!\n\n");
else
printf("双向循环链表非空!\n\n");
int length;
length = Length_DuL(L1);
printf("双向循环链表的长度为: %d\n\n",length);
for(int i=1;i<10;i++)
{
Insert_DuL(&L1,1,i);
}
Out_List(L1);
GetElem_DuL(L1,4,&e);
printf("第4个元素是: %d \n\n",e);
int k = Locate_DuL(L1,7);
printf("元素7的位置是: %d\n\n",k);
Delete_DuL(&L1,3,&e);
printf("删除的第3个元素为: %d\n\n",e);
Out_List(L1);
if(Clear_DuL(&L1))
printf("双向循环链表已清空!\n\n");
if(Empty_DuL(L1))
printf("双向循环链表为空!\n\n");
else
printf("双向循环链表非空!\n\n");
if(Destroy_DuL(&L1))
printf("双向循环链表已被销毁!\n\n");
return 0;
}
Status Create_DuLNode(DuLinkList *L)
{
(*L)=(DuLinkList)malloc(sizeof(DuLNode));
if(!L)
return ERROR;
else
return OK;
}
Status Init_DuL(DuLinkList *L)
{
if(!Create_DuLNode(L))
return ERROR;
else
{
(*L)->next = *L;
(*L)->prior = *L;
return OK;
}
}
Status Empty_DuL(DuLinkList L)
{
if(L->next == L)
return TRUE;
else
return FALSE;
}
int Length_DuL(DuLinkList L)
{
int length = 0;
DuLinkList p = L->next;
while(p != L)
{
++length;
p = p->next;
}
return length;
}
Status Insert_DuL(DuLinkList *L,int i,ElemType e)
{
if(i<1||i>Length_DuL(*L)+1)
{
printf("i的值必须合法!\n");
return ERROR;
}
DuLinkList p = *L;//*L与p是同类型的指针,进行的是赋值操作,相当于p引用*L
DuLinkList s;
int j = 1;
while(j<i)
{
p=p->next;
++j;
}
if(Create_DuLNode(&s))//创建结点成功
{
s->data = e;
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
}
else//创建结点失败
return ERROR;
return OK;
}
//e返回链表中第i个数据元素的值
Status GetElem_DuL(DuLinkList L,int i,ElemType *e)
{
if(i<1||i>Length_DuL(L))
return ERROR;
DuLinkList p = L->next;
int j = 1;
while(j<i)
{
p = p->next;
++j;
}
*e = p->data;
return OK;
}
//获取元素的位置
int Locate_DuL(DuLinkList L,ElemType e)
{
DuLinkList p = L->next;
int k =1;
while(p!=L)
{
if(p->data==e)
break;
else
{
++k;
p=p->next;
}
}
return k;
}
//删除第i个元素的位置
Status Delete_DuL(DuLinkList *L,int i,ElemType *e)
{
if(i<1||i>Length_DuL(*L))
{
printf("i的值必须合法!\n");
return ERROR;
}
DuLinkList p = *L;//相当于p引用*L
int j = 0;
while(j<i)
{
p=p->next;
++j;
}
*e = p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return OK;
}
Status Clear_DuL(DuLinkList *L)
{
DuLinkList p,q;
p = (*L)->next;
while(p != *L)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = *L;
return OK;
}
Status Destroy_DuL(DuLinkList *L)
{
Clear_DuL(L);
free(*L);
return OK;
}
void Out_List(DuLinkList L)
{
DuLinkList p = L->next;
printf("双向循环链表内容: ");
while(p!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n\n");
}
二、效果
![](https://i-blog.csdnimg.cn/blog_migrate/a71f341f8fce1150bae49040beb973c6.png)