#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -1
typedef int Elemt;
typedef struct DULNODE{
Elemt data;
struct DULNODE *pre;//指向前驱
struct DULNODE *next;//指向后继
}DULNDOE,*DULinklist;
//建立一个指定大小的空的双向链表
Elemt creat_n_DULinklist(DULinklist L){
DULinklist p,q;
int n;
p=L;
L->data=0;
printf("input your n:\n");
scanf("%d",&n);
if(n<1) return ERROR;
while(n--) {
q=(DULinklist)malloc(sizeof(DULNDOE));
if(!q) return ERROR;
q->next=L;
q->pre=p;
p->next=q;
p=q ;
}
printf("creat ok.......................\n");
return OK;
}
//向双向链表中插入数值
Elemt in_n_DULinklist(DULinklist L){
DULinklist p;
p=L->next;
while(p!=L){
scanf("%d",&p->data);
p=p->next;
L->data++;
}
return OK;
}
//遍历该双向链表
void bianli_DULinklist(DULinklist L){
DULinklist q;
q=L->next;
printf("................................\n");
while(q != L){
printf("%d\n",q->data);
q=q->next;
}
printf("................................\n");
}
void free_DULinklist(DULinklist L){
DULinklist q,p;
q=L->next;
while(q != L){
p=q;
q=q->next;
free(p);
}
printf("free............\n");
}
//向该双向链表中的第i个位置插入新结点
Elemt in_i_DULinklist(DULinklist L,int i,DULinklist iner){
DULinklist q;
int t=i-1;
q=L->next;
if(i<1 || i>L->data) return ERROR;
while(t--){q=q->next;}
iner->pre=q->pre;
q->pre->next=iner;
iner->next=q;
q->pre=iner;
L->data++;
return OK;
}
//向该链表中插入第i个位置的后面
Elemt in_i_end_DULinklist(DULinklist L,int i,DULinklist iner){
DULinklist q,p;
int t=i-1;
q=L->next;
if(i<1 || i>L->data) return ERROR;
while(t--){
q=q->next;
}
iner->next=q->next;
iner->pre=q->next->pre;
q->next->pre=iner;
q->next=iner;
return OK;
}
//创建单个结点
DULinklist creat_node_DULinklist(){
DULinklist iner;
iner=(DULinklist)malloc(sizeof(DULNDOE));
printf("the node have data is:\n");
scanf("%d",&iner->data);
return iner;
}
//删除该双向链表中的第i个结点
DULinklist del_i_DULinklist(DULinklist L,int i){
DULinklist q,iner;
q=L;
if(i<1 || i>L->data) {printf("error !!!\n"); exit(OVERFLOW);}
while(i--){q=q->next;}
q->next->pre=q->pre;
q->pre->next=q->next;
iner=q;
return iner;
}
int main(){
DULinklist L,iner;
L=(DULinklist)malloc(sizeof(DULNDOE));
//创建n个结点的双向链表
creat_n_DULinklist(L);
//向双向链表中插入值
in_n_DULinklist(L);
//遍历双向链表
bianli_DULinklist(L);
//创建单个结点,为插入做准备
//iner=creat_node_DULinklist();
//向该双向链表中头就头结点后的第i个位置插入(即将之前的第i个位置的结点后移了)新结点
//in_i_DULinklist(L,5,iner);
//向该双向链表中的第i个位置之后插入结点
//in_i_end_DULinklist(L,5,iner);
//删除该双向链表中的第i个结点,并返回该结点给iner
iner=del_i_DULinklist(L,5);
//删除该双向链表中的第i个结点,并用iner返回该结点
//del_i_DULinklist(L,2);
//遍历双向链表
bianli_DULinklist(L);
//释放该双向链表的所有结点(除头结点)
free_DULinklist(L);
//释放头结点
free(L);
free(iner);
return OK;
}