双链表的建立(学习笔记)

写在前面的一些话:这只是个人学习王道数据结构的代码笔记,仅供参考,如果有错误请友好的指出,谢谢!!!

一、双链表的创建

创建一个双链表,打印出链表内的数据元素

#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;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值