双链表基本操作

  1. 初始化(带头结点)
    #include<stdio.h>
    #include<stdbool.h>
    #include<stdlib.h>
    typedef struct {    
        int data;                            //数据域
        struct DList* prior, * next;        //前驱和后继指针
    }DList;
    
    //初始化,带头结点
    bool InitDList(DList* L) {
        L = (DList*)malloc(sizeof(DList));        //分配一个头结点
        if (L == NULL)
            return false;
        L->prior = NULL;                //头结点的prior永远指向NULL
        L->next = NULL;                    //头结点之后暂时还没有结点
        return true;
    }
    
    int main()
    {
        DList L;
        InitDList(&L);
        return 0;
    }

  2. 判断双链表是否为空(带头结点)
    bool Empty(DList* L) {
        if (L->next = NULL)
            return true;
        else
            return false;
    }

  3. 双链表的插入
    //双链表的插入,在p结点后插入s结点
    bool InsertNextDList(DList* p, DList* s) {
        if (p == NULL || s == NULL)
            return false;
        s->next = p->next;
        if (p->next != NULL)
            p->next->prior = s;
        s->prior = p;
        p->next = s;
        return true;
    }

  4. 双链表的删除和销毁
    //删除p的后继结点q
    bool DeleteDList(DList* p) {
        if (p == NULL)
            return false;
        DList* q = p->next;        //找到p的后继节点
        if (q == NULL)
            return false;        //p没有后继
        p->next = q->next;
        if (q->next != NULL)        //q结点不是最后一个结点
            q->next->prior = p;
        free(q);                    //释放空间
        
        return true;
    }
    
    //销毁双链表
    void DestoryList(DList* L) {
        while (L->next != NULL)
            DeleteDList(L);                //循环释放各个数据结点
      free(L);                //释放头结点
      L = NULL;                //头指针指向NULL
    }

  5. 总代码
    #include<stdio.h>
    #include<stdbool.h>
    #include<stdlib.h>
    
    typedef struct DList {
        int data;                            //数据域
        struct DList* prior, * next;        //前驱和后继指针
    }DList;
    
    //初始化,带头结点
    bool InitDList(DList* L) {
        L = (DList*)malloc(sizeof(DList));        //分配一个头结点
        if (L == NULL)
            return false;
        L->prior = NULL;                //头结点的prior永远指向NULL
        L->next = NULL;                    //头结点之后暂时还没有结点
        return true;
    }
    //undefined.判断双链表是否为空(带头结点)
    bool Empty(DList* L) {
        if (L->next = NULL)
            return true;
        else
            return false;
    }
    
    //双链表的插入,在p结点后插入s结点
    bool InsertNextDList(DList* p, DList* s) {
        if (p == NULL || s == NULL)
            return false;
        s->next = p->next;
        if (p->next != NULL)
            p->next->prior = s;
        s->prior = p;
        p->next = s;
        return true;
    }
    
    //删除p的后继结点q
    bool DeleteDList(DList* p) {
        if (p == NULL)
            return false;
        DList* q = p->next;        //找到p的后继节点
        if (q == NULL)
            return false;        //p没有后继
        p->next = q->next;
        if (q->next != NULL)        //q结点不是最后一个结点
            q->next->prior = p;
        free(q);                    //释放空间
        
        return true;
    }
    
    //销毁双链表
    void DestoryList(DList* L) {
        while (L->next != NULL)
            DeleteDList(L);                //循环释放各个数据结点
        free(L);                //释放头结点
        L = NULL;                //头指针指向NULL
    }
    int main()
    {
        DList L;
        InitDList(&L);
        return 0;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值