#include<stdio.h> 

#include<stdlib.h>

typedef struct node{
int data;
struct node*rl,*ll;                                          //rl前驱,ll后继
}db1,*db2;

void create(db2&L,int m){
int a[m];
L=(db1*)malloc(sizeof(db1));
L->rl=L;
L->ll=L;
for(int i=0; i<m;i++){
printf("请输入要储存的数据:") ;
scanf("%d",&a[i]) ;
}
db1 *s,*q,*r=L;
for(int i=0;i<m;i++){
s=(db1*)malloc(sizeof(db1));
s->data=a[i];
q=r->rl;
s->ll=r;
q->ll=s;
r->rl=s;
s->rl=q;
r=s;
}
}                                //初始化,赋值


void print(db2 L,int d){     //d!=0按前驱方向,d=0按后继方向移动
db2 p;
if(d==0) p=L->ll;
else p=L->rl;
while(p!=L){
printf("%d",p->data) ;
p=(d==0)?p->ll:p->rl;
if(p!=L) printf("--") ;
}
printf("\n");
}                            //遍历,输出


void search1 (db2 & L,int x,int d){
db1 *o;
int count=1;
if(d==0) o=L->ll;
else o=L->rl; //db1*o=(b==0)?L->ll:L->rl;
while(o->data!=x && o!=L) {
o=(d==0) ? o->ll:o->rl;
count++;
}
if(o->data==x)
printf("该数据位于第%d位\n",count);
else printf("链表中无此数据!\n");     //数据位置查找
}


int search2(db2 & L,int a,int m,int d) {
db1 *o;
if(d==0) o=L->ll;
else o=L->rl;
if(a<0) printf("错误!");
if(a>m) return 1;
for(int i=0;i<a;i++) {
if(d==0) o=o->ll;
else o=o->rl;
}
if(d==0) printf("该位的数据为%d\n",o->rl->data);
else printf("该位的数据为%d\n",o->ll->data); //查找指定位置的值
}


void inert(db2 & L,int a,int num2,int m,int d){
db1 *o,*s,*p;
int i;
if(d==0) o=L->ll;
else o=L->rl;
while(o!=L && i!=(a-2)){           // a-2是逻辑世界的i- 1
if(d==0) { o=o->ll; }
else { o=o->rl; }
i++;
} //让o指向i-1
s=(db1*)malloc(sizeof(db1));
s->data=num2;
if(d==0) {
s->ll=o->ll;           //让s指向i
o->ll->rl=s;           //让i+1的指针指向s
s->rl=o;               //让i的前驱指向o
o->ll=s;               //让i的后继指向s
}
else {
s->rl=o->rl; o->rl->ll=s;
s->ll=o; o->rl=s;
}
printf("插入数据后的链表为:");
if(d==0) p=L->ll;
else p=L->rl;
while(p!=L){
printf("%d",p->data) ;
p=(d==0)?p->ll:p->rl;
if(p!=L) printf("--") ;
}

}


void delete1(db2 & L,int a,int m,int d) {
db1 *o;
int i;
if(a<0||a>m) printf("位置错误!");
else {
if(d==0) o=L->ll;
else o=L->rl;
while(o!=L && i!=(a-1)){     //a-1是逻辑世界的i
if(d==0) { o=o->ll; }
else { o=o->rl; }
i++;
} //让o指向i
o->ll->rl=o->rl;
o->rl->ll=o->ll;
printf("插入数据后的链表为:");
if(d==0) o=L->ll;
else o=L->rl;
while(o!=L){
printf("%d",o->data) ;
o=(d==0)?o->ll:o->rl;
if(o!=L) printf("--") ;
}
}
}


int main(){
db2 L;
int m,d,num1,num2,a,f;
printf("请输入数据长度:") ;
scanf("%d",&m) ;
create(L,m);
//调用第一个函数 初始化,赋值

printf("请输入数据(d!=0按前驱方向,d=0按后继方向移动):") ;
scanf("%d",&d) ;
print( L, d);
//第二个函数 遍历 输出

printf("请输入需要查找的数据:") ;
scanf("%d",& num1 ) ;
search1 ( L,num1,d);
//第三个函数 查找1

printf("请输入需要查找的位置(不得大于数据长度-1):") ;
scanf("%d",& a ) ;
f=search2( L, a, m, d) ;
if(f==1) printf ("链表没有%d个数据!\n");
//第四个函数 查找2

printf("请输入要插入的位置(不得大于数据长度+1):");
scanf("%d",&a);
printf("请输入要插入的数据值:");
scanf("%d",&num2);
inert( L, a, num2,m, d);
//第五个函数 插入数据

printf("\n");
printf("请输入要删除的数据的位置:");
scanf("%d",&a);
delete1( L, a, m, d);
//第六个函数 删除数据
return 0;
}         //171行

运行结果