• C语言数据结构 双向链表以及基本功能实现


    项目头文件:

    #ifndef _LIST_H_
    #define _LIST_H_
    #include <stdio.h>
    #include<stdlib.h>
    
    typedef int LTDataType;
    typedef struct ListNode {
        LTDataType _data;
        struct ListNode* _next;
        struct ListNode* _prev;
    }ListNode;
    
    typedef struct List {
        ListNode* _head;
    }List;
    
    void ListInit(List* plist);//初始化
    void ListDestory(List* plist);//清空链表
    
    void ListPushBack(List* plist, LTDataType x);//后插
    void ListPopBack(List* plist);//后删
    void ListPushFront(List* plist, LTDataType x);
    void ListPopFront(List* plist);
    
    ListNode* ListFind(List* plist, LTDataType x);//查找
    
    void ListMerge(List* pList1, List* pList2);//将有序链表有序合并
    
    void ListInsertFront(ListNode* pos, LTDataType x);
    void ListInsertAfter(ListNode* pos, LTDataType x);
    // ????pos??????????
    void ListErase(ListNode* pos);//删除
    void ListRemove(List* plist, LTDataType x);//移除指定
    void ListRemoveAll(List* plist, LTDataType x);//移除指定的全部
    void ListPrint(List* plist);//打印
    
    #endif /*_LIST_H_*/

    具体功能实现:

    void ListInit(List* plist)
    {
        plist->_head = (ListNode*)malloc(sizeof(ListNode));
        plist->_head->_next = plist->_head;
        plist->_head->_prev = plist->_head;
    }
    void ListDestory(List* plist)
    {
        while (plist->_head->_next != plist->_head)
        {
            ListPopFront(plist);
        }
        free(plist->_head);
        plist->_head = NULL;
    }
    
    void ListPushBack(List* plist, LTDataType x)
    {
        ListInsertFront(plist->_head, x);
    }
    void ListPopBack(List* plist)
    {
        ListErase(plist->_head->_prev);
    }
    void ListPushFront(List* plist, LTDataType x)
    {
        ListInsertAfter(plist->_head, x);
    }
    void ListPopFront(List* plist)
    {
        ListErase(plist->_head->_next);
    }
    
    ListNode* ListFind(List* plist, LTDataType x)
    {
        ListNode* cur;
        for (cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)
        {
            if (cur->_data == x)
            {
                return cur;
            }
        }
        return NULL;
    }
    
    void ListMerge(List* pList1, List* pList2)//将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
    {
        ListNode* cur1=pList1->_head->_next, *cur2=pList2->_head->_next;
        ListNode* tmp1, *tmp2;
        while (cur1 != pList1->_head&&cur2 != pList2->_head)
        {
            if (cur1->_data > cur2->_data)
            {
                tmp1 = cur1->_prev;
                tmp2 = cur2->_next;
    
                tmp1->_next = cur2;
                cur2->_next = cur1;
                cur1->_prev = cur2;
                cur2->_prev = tmp1;
                cur2 = tmp2;
            }
            else
            {
                cur1 = cur1->_next;
            }
        }
    
        if (cur1 == pList1->_head)
        {
            tmp2 = pList2->_head->_prev;
            cur2->_prev = cur1->_prev;
            cur1->_prev->_next = cur2;
            tmp2->_next = cur1;
            cur1->_prev = tmp2;
        }
        free(pList2->_head);
        pList2->_head = NULL;
    }
    
    void ListInsertFront(ListNode* pos, LTDataType x)
    {
        ListNode* cur = (ListNode*)malloc(sizeof(ListNode));
        cur->_data = x;
        cur->_next = pos;
        cur->_prev = pos->_prev;
        pos->_prev->_next = cur;
        pos->_prev = cur;
    }
    void ListInsertAfter(ListNode* pos, LTDataType x)
    {
        ListNode* cur = (ListNode*)malloc(sizeof(ListNode));
        cur->_data = x;
        cur->_prev = pos;
        cur->_next = pos->_next;
        pos->_next->_prev = cur;
        pos->_next = cur;
    }
    // ????pos??????????
    void ListErase(ListNode* pos)
    {
        pos->_prev->_next = pos->_next;
        pos->_next->_prev = pos->_prev;
        free(pos);
    }
    void ListRemove(List* plist, LTDataType x)
    {
        ListNode * cur = ListFind(plist, x);
    
        if (cur)
        {
            ListErase(cur);
        }
    }
    void ListRemoveAll(List* plist, LTDataType x)
    {
        ListNode* cur;
        for (cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)
        {
            if (cur->_data == x)
            {
                ListErase(cur);
            }
        }
    }
    
    void ListPrint(List* plist)
    {
        ListNode* cur;
        if (plist->_head == NULL)
        {
            printf("NULL
    ");
            return;
        }
        printf("head->");
        for (cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)
        {
            printf("%d-> ",cur->_data);
        }
        printf("head
    ");
    }
  • 相关阅读:
    elasticsearch:shard 和 replica 机制
    zookeeper 的 docker 镜像使用
    zookeeper 图形化的客户端工具:ZooInspector
    zookeeper 学习资料
    Spring Cloud 与 Dubbo、Spring Cloud 与 Docker、Spring Cloud 与 Kubernetes 比较
    可视化界面:ElasticSearch Head,最方便的是直接下载谷歌浏览器扩展程序
    java 中 heap(堆)和stack(栈)的区别
    Elasticsearch 学习资料
    025_lua脚本语言
    004_zookeeper运维之maxClientCnxns overflow
  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/13756241.html
Copyright © 2020-2023  润新知