双向链表的尾插法建表、插入、删除,如果有改进的地方谢谢指正。
#include <stdio.h>
#include <stdlib.h>
typedef struct DuLNode
{
int data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
//尾插法建立双向链表
DuLinkList CreateList_R(DuLinkList L,int n);
//双向链表的插入
DuLinkList ListInsert_DuL(DuLinkList L,int i,int e);
//双向链表的删除
int ListDelete_DuL(DuLinkList L,int i);
//找到单链表中位于i的节点
DuLinkList GetElem_DuL(DuLinkList L,int i);
//双向链表的输出
void Print(DuLinkList L);
int main()
{
DuLinkList L;
while(1){
printf("\n1尾插法建立双向链表\n");
printf("2双向链表的插入\n");
printf("3双向链表的删除\n");
printf("4输出双向链表\n");
printf("请选择要进行的操作\n");
int a;
int n;
int i,e;
scanf("%d",&a);
switch(a){
case 1:
printf("请输入要插入的数据数量:");
scanf("%d",&n);
L = CreateList_R(L,n);
break;
case 2:
printf("请输入要插入的数据位置和内容:");
scanf("%d%d",&i,&e);
L = ListInsert_DuL(L,i,e);
break;
case 3:
printf("请输入要删除数据的位置:");
scanf("%d",&i);
ListDelete_DuL(L,i);
break;
default:
Print(L);
break;
}
}
return 0;
}
//尾插法建立双向链表
DuLinkList CreateList_R(DuLinkList L,int n){
L = (DuLinkList)malloc(sizeof(DuLinkList));
L->next = NULL;
int i = 0;
DuLinkList p = L;
printf("请输入插入的数据:");
for(i = 0;i < n; i++){
DuLinkList e = (DuLinkList)malloc(sizeof(DuLinkList));
e->next = NULL;
scanf("%d",&e->data);
p->next = e;
e->prior = p;
p = p->next;
}
return L;
}
//双向链表的插入
DuLinkList ListInsert_DuL(DuLinkList L,int i,int e){
DuLinkList p;
if(!(p = GetElem_DuL(L,i-1))){
return 0;
}
DuLNode* s = (DuLNode*)malloc(sizeof(DuLNode));
s->data = e;
if(p->next){
p = p->next;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
}
else{
p->next = s;
s->prior = p;
s->next = NULL;
}
return L;
}
//双向链表的删除
int ListDelete_DuL(DuLinkList L,int i){
DuLinkList p;
if(!(p = GetElem_DuL(L,i-1))){
return 0;
}
if(p->next->next){
p = p->next;
p->next->prior = p->prior;
p->prior->next = p->next;
}
else{
DuLinkList q = p;
q->next = NULL;
p = p->next;
}
free(p);
}
//找到单链表中位于i的节点
DuLinkList GetElem_DuL(DuLinkList L,int i){
int j = 0;
DuLinkList q = L;
for(j = 0;j < i;j++){
q = q->next;
}
if(q){
return q;
}
else{
return NULL;
}
}
//双向链表的输出
void Print(DuLinkList L){
DuLinkList p = L;
while(p = p->next){
printf("%d",p->data);
}
}