zoukankan      html  css  js  c++  java
  • 单循环链表的实现

    Main.cpp文件:

    #include"SCList.h"
    void main()
    {
        List mylist;
        InitSCList(&mylist);

        ElemType Item;
        int select = 1;
        while (select)
        {
            printf("************************************************* ");
            printf(" [1] push_back              [2] push_front              * ");
            printf(" [3] show_list                 [4] pop_back               * ");
            printf(" [5] pop_front               [6] insert_val                * ");
            printf(" [7] find                         [8] length                    * ");
            printf(" [9] delete_val               [10] sort                      * ");
            printf(" [11] reserve                  [12] clear                    * ");
            printf(" [13*] destory                 [0] quit_system          * ");
            printf("************************************************* ");
            printf("请选择:");
            scanf("%d", &select);
            if (select == 0)
                break;
            switch (select)
            {
            case 1:
                printf("请输入要插入的数据(-1结束)");
                while (scanf("%d", &Item), Item != -1)
                {
                    push_back(&mylist, Item);
                }
                break;
            case 2:
                printf("请输入要插入的数据(-1结束)");
                while (scanf("%d", &Item), Item != -1)
                {
                    push_front(&mylist, Item);
                }
                break;
            case 3:
                show_list(&mylist);
                break;
            case 4:
                pop_back(&mylist);
                break;
            case 5:
                pop_front(&mylist);
                break;
            case 6:
                printf("请输入要插入的数值");  //升序的顺序进行插入
                scanf("%d", &Item);
                insert_val(&mylist, Item);
                break;
            case 7:
                printf("请输入要查找的数据");
                scanf("%d", &Item);
                Node* p;
                p = find(&mylist, Item);
                if (p == NULL)
                {
                    printf("查找的数据在链表中不存在 ");
                }
                break;
            case 8:
                printf("链表的长度为:%d ", length(&mylist));
                break;
            case 9:
                printf("请输入要删除的数据:");
                scanf("%d", &Item);
                delete_val(&mylist, Item);
                break;
            case 10:
                sort(&mylist);
                break;
            case 11:
                reserve(&mylist);
                break;
            case 12:
                clear(&mylist);
                break;
                case 13:
                /*destory(&mylist);*/
                break;
            default:
                printf("输入的命令错误,请重新输入!");
                break;
            }
        }
        destory(&mylist);
    }

    SCList.h文件:

    #ifndef _SCLIST_H_
    #define _SCLIST_H_

    #include<stdio.h>
    #include<assert.h>
    #include<malloc.h>

    #define ElemType int
    typedef struct Node
    {
        ElemType data;
        struct Node *next;
    }Node;

    typedef struct List
    {
        Node* first;
        Node* last;
        size_t size;
    }List;

    void InitSCList(List *list);
    void push_back(List *list, ElemType x);
    void push_front(List *list, ElemType x);
    void show_list(List *list);
    void pop_back(List *list);
    void pop_front(List *list);
    void insert_val(List *list, ElemType val);
    Node* find(List *list, ElemType x);
    int length(List *list);
    void delete_val(List *list, ElemType x);
    void sort(List *list);
    void reserve(List *list);
    void clear(List *list);
    void destory(List *list);
    ///////////////////////////////////////////////////////////////////////
    Node* buyNode(ElemType x);


    #endif

    SCList.cpp文件:

    #include"SCList.h"

    void InitSCList(List *list)
    {
        Node* s = (Node *)malloc(sizeof(Node));
        assert(s != NULL);
            list->first = list->last = s;
        list->last->next = list->first;
        list->size = 0;
    }

    void push_back(List *list, ElemType x)
    {
        Node* p=buyNode(x);

        list->last->next = p;
        list->last = p;
        list->last->next = list->first;
        list->size++;
    }

    void push_front(List *list, ElemType x)
    {
        Node* p = buyNode(x);

        p->next=list->first->next;
         list->first->next=p;
         if (list->first == list->last)
         {
             list->last = p;
         }
        list->size++;
    }

    void show_list(List *list)
    {
        Node* p = list->first->next;
        while (p != list->first)
        {
            printf("%d--> ", p->data);
            p = p->next;
        }
        printf("NULL. ");
    }

    void pop_back(List *list)
    {
        if (list->size == 0)
            return;

        Node* p = list->first;
        while (p->next != list->last)
        {
            p = p->next;
        }
        free(list->last);
        list->last=p;
        list->last->next = list->first;
        list->size--;
    }

    void pop_front(List *list)
    {
        if (list->size == 0)
            return;

        Node* p = list->first->next;
         list->first->next=p->next;
        free(p);
        if (list->size == 1)
        {
            list->last = list->first;
        }
        list->size--;
    }

    void insert_val(List *list, ElemType val)  //设链表是升序的
    {
        Node* p = list->first;
        while (p->next != list->last&&p->next->data < val)
            p = p->next;

        if (p->next == list->last&&p->next->data < val)    //尾部插入
        {
            push_back(list,val);
        }
        else
        {
            Node* s = buyNode(val);
            s->next = p->next;
            p->next = s;
            list->size++;
        }
    }

    Node* find(List *list, ElemType x)
    {
        if (list->size == 0)
            return NULL;

        Node* p = list->first->next;
        while (p != list->first&&p->data != x)
            p = p->next;

        if (p == list->first)
            return NULL;
        return p;
    }

    int length(List *list)
    {
        return list->size;
    }

    void delete_val(List *list, ElemType x)
    {
        if (list->size == 0)
            return;

        Node* p = find(list, x);
        if (p == NULL)
        {
            printf("要删除的数据不存在! ");
            return;
        }

        if (p == list->last)
        {
            pop_back(list);
        }
        else
        {
            Node* q = p->next;
            p->data = q->data;
            p->next = q->next;
            free(q);
            list->size--;
        }
    }

    void sort(List *list)
    {
        if (list->size == 0 || list->size == 1)
            return;

        Node* s = list->first->next;
        Node* q = s->next;
        list->last->next = NULL;
        list->last = s;
        list->last->next=list->first;
        
        while (q != NULL)
        {
            s = q;
            q = q->next;

            Node* p = list->first;
            while (p->next != list->last&&p->next->data <s->data)
                p = p->next;

            if (p->next == list->last&&p->next->data < s->data)    //尾部插入
            {
                s->next = list->last->next;
                list->last->next = s;
                list->last = s;
            }
            else
            {
                s->next = p->next;
                p->next = s;
            }
        }
    }

    void reserve(List *list)
    {
        if (list->size == 0 || list->size == 1)
            return;

        Node* s = list->first->next;
        Node*q = s->next;
        list->last->next = NULL;
        list->last = s;
        list->last->next = list->first;

        while (q != NULL)
        {
            s = q;
            q = q->next;

            s->next = list->first->next;
            list->first->next = s;
        }
    }

    void clear(List *list)
    {
        Node* p = list->first->next;
        while (p != list->first)
        {
            list->first->next = p->next;
            free(p);
            p = list->first->next;
        }
        list->last = list->first;
        list->last->next = list->first;
        list->size = 0;
    }

    void destory(List *list)
    {
        clear(list);
        free(list->first);
        list->last = list->first = NULL;
    }

    Node* buyNode(ElemType x)
    {
        Node* p = (Node *)malloc(sizeof(Node));
        assert(p != NULL);
        p->data = x;
        p->next = NULL;
        return p;
    }

  • 相关阅读:
    【ceph | 运维】部署osd
    【osd | 运维】osd数据均衡
    leveldb——leveldb入门篇之Linux下编译配置和使用
    【Linux系统编程】预分配磁盘空间
    【filestore】源码剖析
    【Linux】Linux Page Cache的理解
    ceph internal 之 底层对象
    【Linux】磁盘基础知识
    Spring Cloud Alibaba学习08Seata基本使用
    Spring Cloud Alibaba学习05Sentinel基本使用
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5776937.html
Copyright © 2011-2022 走看看