双链表比普通的链表多了指向前方数据的指针,方便对链表的查找。不过在实现方面却复杂了不少,增加或者删除数据的时候要考虑到前后数据指针,其中的操作顺序一定不能错。
#include<stdio.h>
#include<stdlib.h>
#define N 100
typedef int ElemType;
typedef struct Dnode{
ElemType data;
struct Dnode *prior,*next;
}Dnode,*DLinkList;
DLinkList InitList(DLinkList L){//初始化双链表
int k,x;
L=(Dnode *)malloc(sizeof(Dnode));
L->next=L->prior=NULL;
Dnode *p=L;
scanf("%d",&k);
while(k--){
scanf("%d",&x);
Dnode *s=(Dnode *)malloc(sizeof(Dnode));
s->data=x;
s->prior=s->next=NULL;
p->next=s;
s->prior=p;
p=p->next;
}
return L;
}
int Delect(DLinkList L,int x){//删除x元素
Dnode *p=L;
while(p->next){
if(p->next->data==x){
Dnode *t=p->next;
p->next=t->next;
t->next->prior=p;
free(t);
return 1;
}
p=p->next;
}
return 0;
}
void Print(DLinkList L){//输出链表
Dnode *p=L->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
}
int InsBefore(DLinkList L,ElemType x,ElemType y){//x之前插入y
Dnode *p=L;
while(p->next&&p->next->data!=x){
p=p->next;
}
if(p->next==NULL||p->next->data!=x) return 0;
else {
Dnode *Y=(Dnode *)malloc(sizeof(Dnode));
Y->data=y;
p->next->prior=Y;
Y->next=p->next;
Y->prior=p;
p->next=Y;
return 1;
}
}
int InsAfter(DLinkList L,ElemType x,ElemType y){//x之后插入y
Dnode *p=L->next;
while(p&&p->data!=x){
p=p->next;
}
if(p==NULL||p->data!=x) return 0;
else {
Dnode *Y=(Dnode *)malloc(sizeof(Dnode));
Y->data=y;
Y->next=Y->prior=NULL;
if(p->next!=NULL){
p->next->prior=Y;
Y->next=p->next;
}
p->next=Y;
Y->prior=p;
return 1;
}
}
void Reverse(DLinkList L){//逆转链表
Dnode *p=L->next;
L->next=NULL;
while(p){
Dnode *t=p;
p=p->next;
t->next=L->next;
L->next=t;
t->prior=L;
}
}
int main()
{
int i,j,k,x;
DLinkList L=InitList(L);
Reverse(L);
Print(L);
return 0;
}