#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
//定义双向循环链表结构
typedef struct DuLNode
{
ElemType data;
struct DuLNode *next;
struct DuLNode *prior;
}DuLNode,*DuLinkList;
//初始化链表
Status InitDuLinkList(DuLinkList &L)
{
L=(DuLNode*)malloc(sizeof(DuLNode));
if(!L)
return ERROR;
L->next=L;
L->prior=L;
return OK;
}
//创建如下数据(2,6,8,9,11,15,20)的双向循环链表
Status CreateDuLinkList(DuLinkList &L,ElemType a[],ElemType n)
{
DuLNode *r=L;
for(int i=0;i<n;i++)
{
DuLNode *p=(DuLNode*)malloc(sizeof(DuLNode));
if(!p)
return ERROR;
p->data=a[i];
p->prior=r;
r->next=p;
r=p;
L->prior=r;
r->next=L;
}
return OK;
}
//打印链表L
void DispDuLinkList(DuLinkList L)
{
if(L->next==L)
return ;
DuLNode *p=L->next;
while(p!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//求链表中元素个数
int DuLinkLength(DuLinkList L)
{
DuLinkList p;
p=L->next;
int i=0;
while(p!=L)
{
i++;
p=p->next;
}
return i;
}
//在双向循环链表L中查找第1个与任意给定值e相等的元素位置,找到返回其在L中的位序,否则返回0。
int GetElem(DuLinkList L,ElemType e)
{
DuLinkList p=L->next;
int i=1;
while(p!=L)
{
if(p->data==e)
return i;
else{
p=p->next;
i++;
}
}
return 0;
}
//获取双向循环链表中第i个元素的值,并将其保存在e中。
Status GetElem_i(DuLinkList L,int i)
{
DuLinkList p=L->next;
ElemType e;
int j=1;
while(p!=L&&j<i)
{
p=p->next;
j++;
}
if(p==L||j>i)
return ERROR;
e=p->data;
return OK;
}
//在双向循环链表L中第i个位置之前插入新的元素e(e的值为任意整数).
Status InsertDuList(DuLinkList &L,int i,ElemType e)
{
DuLinkList p=L->next,s;
int j=1;
while(p!=L&&j<i)
{
p=p->next;
j++;
}
if(p==L||j>i)
return ERROR;
s=(DuLNode*)malloc(sizeof(DuLNode));
if(!s)
return ERROR;
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return OK;
}
//删除链表L中第i个元素,并用e返回其值。
Status DelDuLink_i(DuLinkList &L,int i)
{
ElemType e;
DuLinkList p=L,s;
int j=0;
while(j<i)
{
p=p->next;
j++;
if(p==L)
return ERROR;
}
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return OK;
}
int main()
{
DuLinkList L;
ElemType a[]={2,6,8,9,11,15,20};
InitDuLinkList(L);
CreateDuLinkList(L,a,sizeof(a)/sizeof(a[0]));
DispDuLinkList(L);
printf("元素个数:%d\n",DuLinkLength(L));
printf("%d\n",GetElem(L,6));
GetElem_i(L,6);
InsertDuList(L,4,66);
DispDuLinkList(L);
DelDuLink_i(L,6);
DispDuLinkList(L);
return 0;
}