写在前面的一些话:这只是个人学习王道数据结构的代码笔记,仅供参考,如果有错误请友好的指出,谢谢!!!
一、双链表的创建
创建一个双链表,打印出链表内的数据元素
#include <stdio.h>
#include <stdlib.h>
typedef struct DNode{//定义双链表节点类型
int data;//数据域
struct DNode *prior,*next;//前驱和后继指针
}DNode,*DLinkList;
bool InitDLinkList(DLinkList &L){
L=(DLinkList) malloc(sizeof(DNode));//分配一个头节点
if(L==NULL)//内存不足分配失败
return false;
L->prior=NULL;//头节点的prior永远指向NULL
L->next=NULL;//头节点之后还暂时没有结点,先设置为空
return true;
}
bool InsertNextDNode(DNode *p,DNode *s){//在p节点之后插入s节点
if(p==NULL||s==NULL) //非法参数
return false;
s->next=p->next;
if(p->next!=NULL) //如果p有后继节点
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
void Print_DLinkList(DLinkList L){
//依次打印双链表的全部数据元素
DNode *p=L->next;
printf("使用后继指针打印数据元素");
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
p=L->next;
while(p->next!=NULL)//找到最后一个节点
p=p->next;
printf("使用前驱指针打印数据元素:");
while(p->prior!=NULL){
printf("%d ",p->data);
p=p->prior;
}
}
int main(){
DLinkList L;
InitDLinkList(L);//初始化一个双链表
DNode *s;
int x;
scanf("%d",&x);
while(x!=9999){
s=(DNode *) malloc(sizeof (DNode));
s->data=x;
InsertNextDNode(L,s);
scanf("%d",&x);
}
Print_DLinkList(L);
return 0;
}
二、双链表的删除
1.单个元素的删除(按位序删除)
代码如下(示例):
#include <stdio.h>
#include <stdlib.h>
typedef struct DNode{//定义双链表节点类型
int data;//数据域
struct DNode *prior,*next;//前驱和后继指针
}DNode,*DLinkList;
bool InitDLinkList(DLinkList &L){
L=(DLinkList) malloc(sizeof(DNode));//分配一个头节点
if(L==NULL)//内存不足分配失败
return false;
L->prior=NULL;//头节点的prior永远指向NULL
L->next=NULL;//头节点之后还暂时没有结点,先设置为空
return true;
}
bool InsertNextDNode(DNode *p,DNode *s){//在p节点之后插入s节点
if(p==NULL||s==NULL) //非法参数
return false;
s->next=p->next;
if(p->next!=NULL) //如果p有后继节点
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
bool DeleteNextDNode(DNode *p){//删除p节点后的后继节点
if(p==NULL)
return false;
DNode *q=p->next;//找到p的后继节点
if(q==NULL)
return false;//p没有后继节点
p->next=q->next;
if(q->next!=NULL)
q->next->prior=p;//q不是最后一个节点
free(q);//释放节点空间
return true;
}
bool DeleteDNode(DLinkList &L,int i){
if(i<1)
return false;
int j=0;
DNode *p=L;
while(j<i-1&&p!=NULL){//循环找到i前面的节点
p=p->next;
j++;
}
return DeleteNextDNode(p);//删除节点i
}
void Print_DLinkList(DLinkList L){
//依次打印双链表的全部数据元素
DNode *p=L->next;
printf("使用后继指针打印数据元素");
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
p=L->next;
while(p->next!=NULL)//找到最后一个节点
p=p->next;
printf("使用前驱指针打印数据元素:");
while(p->prior!=NULL){
printf("%d ",p->data);
p=p->prior;
}
}
int main(){
DLinkList L;
InitDLinkList(L);//初始化一个双链表
DNode *s;
int x;
scanf("%d",&x);
while(x!=9999){
s=(DNode *) malloc(sizeof (DNode));
s->data=x;
InsertNextDNode(L,s);
scanf("%d",&x);
}
Print_DLinkList(L);
DeleteDNode(L,3);//删除第3个节点
Print_DLinkList(L);
return 0;
}
2.删除双链表(销毁双链表)
代码如下(示例):
#include <stdio.h>
#include <stdlib.h>
typedef struct DNode{//定义双链表节点类型
int data;//数据域
struct DNode *prior,*next;//前驱和后继指针
}DNode,*DLinkList;
bool InitDLinkList(DLinkList &L){
L=(DLinkList) malloc(sizeof(DNode));//分配一个头节点
if(L==NULL)//内存不足分配失败
return false;
L->prior=NULL;//头节点的prior永远指向NULL
L->next=NULL;//头节点之后还暂时没有结点,先设置为空
return true;
}
bool InsertNextDNode(DNode *p,DNode *s){//在p节点之后插入s节点
if(p==NULL||s==NULL) //非法参数
return false;
s->next=p->next;
if(p->next!=NULL) //如果p有后继节点
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
bool DeleteNextDNode(DNode *p){//删除p节点后的后继节点
if(p==NULL)
return false;
DNode *q=p->next;//找到p的后继节点
if(q==NULL)
return false;//p没有后继节点
p->next=q->next;
if(q->next!=NULL)
q->next->prior=p;//q不是最后一个节点
free(q);//释放节点空间
return true;
}
void DestroyList(DLinkList &L){
//循环释放各个节点
while(L->next!=NULL)
DeleteNextDNode(L);
free(L); //释放头节点
L=NULL; //头节点指针指向NULL
printf("成功销毁双链表!!!\n");
}
void Print_DLinkList(DLinkList L){
//依次打印双链表的全部数据元素
DNode *p=L->next;
printf("使用后继指针打印数据元素\n");
while(p!=NULL){
printf("%d\n",p->data);
p=p->next;
}
p=L->next;
while(p->next!=NULL)//找到最后一个节点
p=p->next;
printf("使用前驱指针打印数据元素:\n");
while(p->prior!=NULL){
printf("%d\n",p->data);
p=p->prior;
}
}
int main(){
DLinkList L;
InitDLinkList(L);//初始化一个双链表
DNode *s;
int x;
scanf("%d",&x);
while(x!=9999){
s=(DNode *) malloc(sizeof (DNode));
s->data=x;
InsertNextDNode(L,s);
scanf("%d",&x);
}
Print_DLinkList(L);
DestroyList(L);
return 0;
}