双向链表的实现
基本操作
bool InitDLinkList(DLinkList &L);
bool Empty(DLinkList L);
bool InsertNextDNode(DNode *p, int e);//在p结点之后插入s节点//后插操作
bool DeleteNextDNode(DNode *p);//删除p结点的后继结点
void DestroyDList(DLinkList &L);//销毁一个双向链表
bool PrintDList(DLinkList L);
//双向链表 带头结点
#include<stdio.h>
#include<stdlib.h>
typedef struct DNode{//定义双向链表结点的数据类型
int data; //数据域
struct DNode *prior,*next;//前驱和后继指针,这里结构体必须有名字即DNode
}DNode,*DLinkList;
bool InitDLinkList(DLinkList &L);
bool Empty(DLinkList L);
bool InsertNextDNode(DNode *p, int e);//在p结点之后插入s节点//后插操作
bool DeleteNextDNode(DNode *p);//删除p结点的后继结点
void DestroyDList(DLinkList &L);//销毁一个双向链表
bool PrintDList(DLinkList L);
//初始化
bool InitDLinkList(DLinkList &L){
L=(DNode*)malloc(sizeof(DNode));
if(L==NULL){
printf("malloc failure");
return false;
}
L->next=L->prior=NULL;//头结点的prior永远指向NULL
//头结点之后暂时还没有结点
return true;
}
//判断双链表是否为空
bool Empty(DLinkList L){
return L->next==NULL;
}
//在p结点之后插入值为e的结点
//后插操作
//按位序插入和前插操作都可以转换为后插实现
bool InsertNextDNode(DNode *p, int e){
if(p==NULL){
printf("p==NULL\n");
return false;
}
DNode *s=(DNode*)malloc(sizeof(DNode));
if(s==NULL){
printf("malloc failure\n");
return false;
}
s->data=e;
s->next=p->next;
if(p->next == NULL){//p是头结点
p->next=s;
s->prior=p;
return true;
}
DNode *q=p->next;
p->next->prior=s;
p->next=s;
s->prior=p;
return true;
}
//删除p结点的后继结点
bool DeleteNextDNode(DNode *p){
if(p==NULL){
printf("p==NULL\n");
return false;
}
DNode *q=p->next;
if(!q){//p为最后一个结点
printf("q==NULL\n");
return false;
}
if(q->next==NULL){//q为最后一个结点,此时要删除q
p->next=q->next;
}
else{
p->next=q->next;
q->next->prior=p;
}
free(q);
return true;
}
//销毁一个双向链表
void DestroyDList(DLinkList &L){
DNode*p=L;
while(p){
L=L->next;
free(p);
p=L;
}
printf("\n销毁成功\n");
}
bool PrintDList(DLinkList L){
DNode *p=L->next;
printf("\nDList is:");
while(p){
printf("%d ",p->data);
p=p->next;
}
return true;
}
int main(){
DLinkList L;
InitDLinkList(L);
if(Empty(L)){
printf("Empty\n");
}
DNode *p=L;
for(int i=0;i<10;i=i+2){
if(InsertNextDNode(p,i+1)){
printf("插入成功\n");
p=p->next;
}
else{
printf("插入失败\n");
}
}
PrintDList(L);
p=L;
DeleteNextDNode(p);
PrintDList(L);
DestroyDList(L);
}