//Author:张佳琪
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct DLinkedList
{
ElemType data;
struct DLinkedList *pre;
struct DLinkedList *next;
}Node;
Node* create()
{
Node *head,*p,*s;
ElemType x;
head=(Node *)malloc(sizeof(Node));
p=head;
while(scanf("%d",&x))
{
if(x==0)
break;
s=(Node *)malloc(sizeof(Node));
s->data=x;
s->pre=p;
p->next=s;
p=s;
}
head=head->next;
head->pre=p;
p->next=head;
return head;
}
Node* insert(Node *head,int i,ElemType x)
{
Node *p;
p=head;
Node *q;
q=(Node *)malloc(sizeof(Node));
q->data=x;
int j;
if(i!=1)
{
for(j=1;j<i-1;j++)
p=p->next;
q->next=p->next;
p->next->pre=q;
q->pre=p;
p->next=q;
}
else
{
while(p->next!=head)
{
p=p->next;
}
q->next=head;
head->pre=q;
p->next=q;
q->pre=p;
head=q;
}
return head;
}
Node* deleteelem(Node *head,ElemType x)
{
Node *p,*q;
p=head;
q=head;
while(1)
{
if(p->data!=x&&p->next!=head)
{
q=p;
p=p->next;
}
else if(p->data==x&&p->next!=head)
{
if(p!=head)
{
q->next=p->next;
p->next->pre=q;
free(p);
p=q->next;
}
else
{
while(q->next!=head)
{
q=q->next;
}
q->next=p->next;
p->next->pre=q;
head=p->next;
free(p);
p=head;
}
}
else if(p->data==x&&p->next==head)
{
q->next=head;
head->pre=q;
free(p);
break;
}
else if(p->data!=x&&p->next==head)
{
break;
}
}
return head;
}
Node* deletepos(Node *head,int i)
{
int j;
Node *p,*q;
p=head;
if(i!=1)
{
for(j=1;j<i-1;j++)
p=p->next;
q=p->next;
p->next=q->next;
q->next->pre=p;
free(q);
}
else
{
while(p->next!=head)
{
p=p->next;
}
head=head->next;
p->next=head;
head->pre=p;
}
return head;
}
void show(Node *head)
{
Node *p;
p=head;
while(1)
{
printf("%d ",p->data);
if(p->next==head)
break;
p=p->next;
}
printf("\n");
}
int main()
{
Node *head;
int i,j;
while(1)
{
printf("----@@@menu@@@----\n");
printf("1.建立\n");
printf("2.在某个位置插入\n");
printf("3.在某个位置删除\n");
printf("4.删除特定值\n");
printf("5.输出\n");
printf("输入1-5:");
scanf("%d",&i);
switch(i)
{
case 1:
{
head=create();
break;
}
case 2:
{
printf("在哪里插入,插入啥:");
scanf("%d %d",&i,&j);
head=insert(head,i,j);
break;
}
case 3:
{
printf("在哪里删除:");
scanf("%d",&i);
head=deletepos(head,i);
break;
}
case 4:
{
printf("删除值:");
scanf("%d",&i);
head=deleteelem(head,i);
break;
}
case 5:
{
show(head);
break;
}
}
}
}