实现王道书上双链表算法代码可执行
双链表的插入和删除时间复杂度均为O(1)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <malloc.h>
typedef struct DNode{
int data;
struct DNode *prior,*next;
}DNode,*DLinkList;//DNode * L <=> DLinkList L
//初始化双链表
DLinkList InitDLinkList(DLinkList L){
L = (DNode *)malloc(sizeof(DNode));//L永远指向第一个节点,也叫头节点,不保存数据,只为方标检索
if(L==NULL){//内存分配失败
return NULL;
}
L->next=NULL;
L->prior=NULL;
printf("双链表的初始化成功!\n");
return L;
}
//获取list表的最后一个节点,以便顺序输出链表
DNode *FinalNode(DLinkList L){
while(L->next!=NULL){
L=L->next;
}
return L;
}
//插入数据(后插操作),在p节点的后面插入s节点
bool InsertNextDNode(DLinkList L,DNode *p,DNode *s){
if(p==NULL||s==NULL){
printf("传入的参数不合法!\n");
return false;
}
s->next = p->next;
if(p->next!=NULL){//若p为最后一个节点,则跳出if
p->next->prior = s;
}
s->prior = p;
p->next = s;
return true;
}
//寻找要删除的节点p
DNode *DelLocalNode(DLinkList L,int e){
while(L->next!=NULL){
L=L->next;
if(L->data==e){
break;
}
}
return L;
}
//删除双链表(删除p节点的后继节点)
bool DeleteNextDNode(DNode *p){
if(p==NULL){//参数不合法
return false;
}
DNode *q = p->next;
if(q==NULL){//p没有后继节点
return false;
}
p->next = q->next;
if(q->next!=NULL){
q->next->prior = p;
}
free(q);
return true;
}
//输出整个双链表的数据
void Print(DLinkList L){
L=L->next;
while(L!=NULL){
printf("%d ",L->data);
L=L->next;
}
}
int main()
{
DLinkList L;
DLinkList list = InitDLinkList(L);//得到初始化后的链表list,此后操作都在list上进行
//在list上进行插入数据操作
DNode *S;//用来存储即将插入的数据
int x;
printf("请输入要插入的数据:\n");
scanf("%d",&x);
while(x!=99){
//让P每次都指向list的最后一个节点
DNode *P = FinalNode(list);
S = (DNode *)malloc(sizeof(DNode));
S->data = x;
printf("请输入要插入的数据:\n");
InsertNextDNode(list,P,S);
scanf("%d",&x);
}
printf("执行插入后的链表为:\n");
Print(list);
//进行删除操作,先获取要删除的节点,预设插入的链表为1 2 3 4 5 6 7 ,我们删除6
DNode *del = DelLocalNode(list,6);
DeleteNextDNode(del);
printf("删除后的数据为:\n");
Print(list);
return 0;
}
执行结果: