C语言双向链表爱吃窝窝头2023-11-302023-11-30//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();}