#include<stdio.h>
#include<stdlib.h>
typedef struct link
{
int date;
struct link *pre;
struct link *next;
}Node,*NODE;
NODE creat()
{
NODE p;
p=(NODE)malloc(sizeof(Node));
p->next=NULL;
p->pre=NULL;
}
void listlink(NODE l,int n)
{
NODE p,q;
int i,m;
p=creat();
l->next = p;
scanf("%d",&m);
p->date=m;
for(i=1;i<n;i++)
{
scanf("%d",&m);
q=(NODE)malloc(sizeof(Node));
q->date=m;
q->pre=p;
q->next=p->next;
p->next=q;
p=q;
}
}
void ListDelete(NODE *L,int i,int *e)
{
NODE p,q;
p=*L;
int j=1;
while(j<i&&p)
{
p=p->next;
j++;
}
q=p->next;
*e=q->date;
if(q->next)
{
q->next->pre = p;
p->next=q->next;
free(q);
}
else
{
p->next=NULL;
free(q);
}
}
void ListInsert(NODE *L,int i,int e)
{
NODE p,q;
p=creat();
p->date=e;
q=*L;
int j=1;
while(j<i&&q)
{
q=q->next;
j++;
}
p->next=q->next;
q->next->pre=p;
q->next=p;
p->pre=q;
}
void LocateElem(NODE l,int *e,int n)
{
NODE p;
int i=1;
p=l->next;
while(p)
{
if(p->date==n)
{
*e=i;
break;
}
p=p->next;
i++;
}
}
void ListChange(NODE l,int oldelem)
{
NODE p;
p=l->next;
while(p->date!=oldelem&&p)
p=p->next;
if(p->date==oldelem)
{
printf("请输入将%d修改为:",oldelem);
scanf("%d",&p->date);
}
else
printf("没有找到需要修改的元素");
}
void PRINTF(NODE l)
{
NODE p;
p=l->next;
while(p)
{
printf("%d ",p->date);
p=p->next;
}
}
int main()
{
NODE l;
l=creat();
int n;
printf("请输入要建立的链表元素的个数:");
scanf("%d",&n);
printf("请输入链表元素\n");
listlink(l, n);
PRINTF(l);
printf("\n");
printf("请输入要删除元素的位置");
scanf("%d",&n);
ListDelete(&l,n,&n);
printf("取出的数为%d\n",n);
PRINTF(l);
printf("\n");
printf("请输入要插入元素的位置:");
scanf("%d",&n);
ListInsert(&l,n,100);
PRINTF(l);
printf("\n");
printf("请输入要查找的数:");
scanf("%d",&n);
LocateElem(l,&n,n);
printf("它在链表中的位置为%d",n);
printf("\n");
printf("请输入要修改的元素");
scanf("%d",&n);
ListChange(l,n);
PRINTF(l);
return 0;
}