双向链表

//2022.9.16双向链表
#include<stdio.h>
#include<stdlib.h>


typedef struct dlink{
int data;//代表数据域
struct dlink *prior,*next;//prior代表前驱,next代表后继
}dlink;//双链表节点名

dlink *L;
//初始化链表
void initlink()
{
L=(dlink *)malloc(sizeof(dlink));
L->next=NULL;
L->prior=NULL;
}
//创建双向链表
void creatlink(int n){
dlink *p;
initlink();
int i;
for(i=1;i<=n;i++){
p=(dlink*)malloc(sizeof(dlink));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
p->prior=L;
L->next->prior=p;
}
}
//遍历(输出访问)
void output(){
dlink *p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
//插入
void insertlink(int i,int e){
dlink *p,*s;
p=L;
int j=0;
while(j<i-1&&p){
p=p->next;
j++;
}
if(j>i-1||!p)
{
printf("插入位置不存在:\n");
exit(0);
}
s=(dlink *)malloc(sizeof(dlink));
s->data=e;
s->next=p->next;
s->prior=p;
p->next=s;
p->next->prior=s;
}
//删除
int dellink(int i){
dlink *p,*q;
int j,e;
p=L;
j=0;
while(j<i-1&&p->next){
p=p->next;
j++;
}
if(j>i-1||!p->next) //是否合法
{
printf("插入位置不存在:\n");
exit(0);
}
q=p->next;
e=q->data;
p->next=q->next;
q->next->prior=p;
free(q); //释放已分配的内存
return e;
}
void main(){
int n,i,e,x;
initlink();
printf("请输入像创建的元素个数:");
scanf("%d",&n);
printf("请输入元素:");
creatlink(n);
printf("输出结果为:");
output();
printf("\n输入插入位置:");
scanf("%d",&i);
printf("输入插入的值:");
scanf("%d",&e);
insertlink(i,e);
printf("输出插入后的链表:");
output();
printf("\n请输入删除的值位置:");
scanf("%d",&x);
printf("返回删除的值:");
printf("%d",dellink(x));
printf("\n返回删除后的链表:");
output();
}