#include<stdio.h>
#include<malloc.h>
//雙向循環鏈表的表示和實現,帶頭結點
typedef int ElemType;
typedef struct node{
struct node *next;
struct node *prior;
ElemType data;
}dlink;
//創建循環鏈表
dlink *creatdlink(int n){
dlink *head,*p,*s;
int i;
p=head=(dlink *)malloc(sizeof(dlink));
for(i=1;i<=n;i++){
s=(dlink *)malloc(sizeof(dlink));
scanf("%d",&s->data);
p->next=s;
s->prior=p;
p=s;
}
p->next=head;
head->prior=p;
return head;
}
//輸出操作,從正向輸出鏈表
dlink *showdlink(dlink *head){
dlink *p;
p=head->next;
while(p!=head){
printf("%d ",p->data);
p=p->next;
}
return head;
}
//求表長操作,
int getlen(dlink *head){
int i;
dlink *p;
p=head->next;i=0;
while(p!=head){
p=p->next;
i++;
}
return i;
}
//刪除操作,刪除帶頭結點的雙向循環鏈表的第i個結點
int deletei(dlink *head,int i){
dlink *p,*s;
int j;
p=head->next;j=1;
if(i<1)return 0;//未刪除成功
while(p!=head&&j<i-1){
p=p->next;
j++;
}
if(p==head)return 0;
s=p->next;
p->next=s->next;
s->next->prior=p;
free(s);
return 1;//刪除成功
}
//插入操作,向帶有頭結點的雙向循環鏈表第i個結點前插入一個結點
int insertx(dlink *head,int i,ElemType x){
dlink *p,*s;
int j;
p=head->next;j=1;
if(i<1)return 0;
while(p!=head&&j<i-1){
p=p->next;
j++;
}
if(p==head)return 0;
s=(dlink *)malloc(sizeof(dlink));
s->data=x;
s->next=p->next;
s->prior=p;
p->next->prior=s;
p->next=s;
return 1;
}
int main(){
dlink *head;
head=creatdlink(5);
showdlink(head);
printf("該鏈表表長爲:%d\n",getlen(head));
// deletei(head,3);//刪除第3個結點
// insertx(head,3,9);//在第3個結點前插入9
showdlink(head);
}