单向链表有一定的缺陷,其中一个就是只能一条路走到黑,只能前进不能后退,但双向链表就解决了这一问题
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
struct node *prior;
}node,*linklist;
void create_list_tail(linklist *l)//头插法建立
{
int i,j,x;
linklist p,r;
(*l)=(node*)malloc(sizeof(node));
(*l)->prior=NULL;
(*l)->next=NULL;
printf("please input the length:");
scanf("%d",&j);
(*l)->data=x;
//r=(*l);
for(i=0;i<j;i++)
{
scanf("%d",&x);
p=(node*)malloc(sizeof(node));
p->data=x;
p->next=(*l)->next;
p->prior=(*l);
(*l)->next=p;
}
}
void create_list_head(linklist *l)//头插法建立
{
int i,j,x;
linklist p,r;
(*l)=(node*)malloc(sizeof(node));
(*l)->next=NULL;
(*l)->next=NULL;
printf("please input the length:");
scanf("%d",&j);
(*l)->data=j;
r=(*l);
for(i=0;i<j;i++)
{
scanf("%d",&x);
p=(node*)malloc(sizeof(node));
p->data=x;
p->prior=r;
r->next=p;
r=p;
}
p->next=NULL;
}
void delete_list(linklist *l)//
{
linklist p;
int i,j;
printf("please input:");
scanf("%d",&j);
p=(*l)->next;
for(i=1;i<j;i++)
{
p=p->next;
}
p->prior->next=p->next;
p->next->prior=p->prior;
}
void insert_list(linklist *l)//插入操作
{
int i,j,x;
linklist p,r;
r=(node*)malloc(sizeof(node));
p=(*l)->next;
printf("please input:");
scanf("%d %d",&j,&x);
for(i=1;i<j;i++)
{
p=p->next;
}
r->data=x;
r->prior=p;
r->next=p->next;
p->next->prior=r;
p->next=r;
}
void print_list(linklist *l)
{
linklist p;
p=(*l)->next;
while(p)
{
printf("%d\n",p->data);
p=p->next;
}
}
int main()
{
linklist a;
//create_list_tail(&a);
create_list_head(&a);
//delete_list(&a);
insert_list(&a);
print_list(&a);
return 0;
}
其他功能可以根据上述代码修改实现,与单向链表操作差不多