zoukankan      html  css  js  c++  java
  • 循环双链表

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElementType;
    
    struct DoubleCircularListNode
    {
        ElementType Element;
        struct DoubleCircularListNode *Prior;
        struct DoubleCircularListNode *Next;
    };
    
    struct DoubleCircularListNode* DoubleCircularListInit()
    {
        struct DoubleCircularListNode* ListHead = malloc(sizeof(struct DoubleCircularListNode));
        ListHead -> Prior = ListHead -> Next = ListHead;
        return ListHead;
    }
    
    int DoubleCircularListNodeAdd(struct DoubleCircularListNode *ListHead,ElementType ToBeInsert)
    {
        struct DoubleCircularListNode* TmpCell;
        struct DoubleCircularListNode* LastNode;
    
        TmpCell = malloc(sizeof(struct DoubleCircularListNode));
        TmpCell -> Element = ToBeInsert;
    
        LastNode = ListHead -> Prior;
    
        TmpCell -> Prior = LastNode;
        TmpCell -> Next = ListHead;
        ListHead -> Prior = LastNode -> Next = TmpCell;
    
        return 0;
    }
    
    int DoubleCircularListIsEmpty(struct DoubleCircularListNode *ListHead)
    {
        return (ListHead->Next == ListHead);
    }
    
    int DoubleCircularListIsLast(struct DoubleCircularListNode *PtrToNode,struct DoubleCircularListNode *ListHead)
    {
        return (PtrToNode -> Next == ListHead);
    }
    
    //Warning:ensure the return pointer doesn't point to ListHead
    struct DoubleCircularListNode* DoubleCircularListNodeFind(ElementType ToBeFind,struct DoubleCircularListNode *ListHead)
    {
        struct DoubleCircularListNode* Pointer;
    
        Pointer = ListHead -> Next;
        while(Pointer != ListHead && Pointer -> Element != ToBeFind)
        {
            Pointer = Pointer -> Next;
        }
    
        return Pointer;
    }
    
    int DoubleCircularListNodeDelete(ElementType ToBeDelete,struct DoubleCircularListNode *ListHead)
    {
        struct DoubleCircularListNode *Pointer;
    
        Pointer = DoubleCircularListNodeFind(ToBeDelete,ListHead);
        
        if(Pointer == ListHead)
        {
            return 1;
        }
        else if(Pointer -> Prior == ListHead)
        {
            ListHead -> Prior = ListHead -> Next = ListHead;
            free(Pointer);
            return 0;
        }
        else
        {
            Pointer -> Next -> Prior = Pointer -> Prior;
            Pointer -> Prior -> Next = Pointer -> Next;
            free(Pointer);
            return 0;
        }
        return 1;
    }
    
    int MakeDoubleCircularListEmpty(struct DoubleCircularListNode *ListHead)
    {
        struct DoubleCircularListNode *Pointer_1;
        struct DoubleCircularListNode *Pointer_2;
    
        if(ListHead != NULL)
        {
            Pointer_1 = ListHead;
            Pointer_2 = ListHead -> Next;
            while(Pointer_2 != ListHead)
            {
                Pointer_1 = Pointer_2;
                Pointer_2 = Pointer_2 -> Next;
                free(Pointer_1);
            }
            ListHead -> Prior = ListHead -> Next = ListHead;
        }
        else
        {
            return 1;
        }
        return 0;
    }
    
    int DoubleCircularListDelete(struct DoubleCircularListNode *ListHead)
    {
        MakeDoubleCircularListEmpty(ListHead);
        free(ListHead);
        return 0;
    }
    
    int DoubleCircularListNodeInsert(struct DoubleCircularListNode *ListHead,ElementType ToBeInsert,struct DoubleCircularListNode *PositionBeforeToBeInsert)
    {
        struct DoubleCircularListNode* TmpCell;
    
        TmpCell = malloc(sizeof(struct DoubleCircularListNode));
        TmpCell -> Element = ToBeInsert;
    
        
        if(TmpCell == NULL)
        {
            return 1;
        }
        
        TmpCell -> Prior = PositionBeforeToBeInsert;
        TmpCell -> Next = PositionBeforeToBeInsert -> Next;
        PositionBeforeToBeInsert -> Next -> Prior = TmpCell;
        PositionBeforeToBeInsert -> Next = TmpCell;
        return 0;
    }
    
    int main()
    {
        struct DoubleCircularListNode* ListHead;
        ListHead = DoubleCircularListInit();
        DoubleCircularListNodeInsert(ListHead,1,ListHead);
        DoubleCircularListNodeInsert(ListHead,3,DoubleCircularListNodeFind(1,ListHead));
        DoubleCircularListNodeAdd(ListHead,4);
        DoubleCircularListNodeInsert(ListHead,2,DoubleCircularListNodeFind(1,ListHead));
        int test = DoubleCircularListNodeDelete(2,ListHead);
        printf("test = %d %d
    ",test,ListHead -> Next -> Element);
        printf("%d
    ",ListHead -> Next -> Next -> Element);
        //printf("%d
    ",ListHead -> Next -> Next -> Next -> Element);
        test = DoubleCircularListNodeDelete(2,ListHead);
        printf("test = %d %d
    ",test,ListHead -> Next -> Next -> Element);
        //printf("%d
    ",ListHead -> Next -> Next -> Next -> Element);
        //printf("%d
    ",DoubleCircularListNodeFind(3,ListHead)->Element);
        DoubleCircularListDelete(ListHead);
        return 0;
    }
  • 相关阅读:
    2018.5.22 Oracle安装配置在虚拟机中外部电脑连接服务
    2018.5.20 oracle强化练习
    2018.5.19 Oracle数据操作和管理表的综合练习
    2018.5.18 AndroidStudio创建项目出错
    2018.5.17 oracle函数查询
    2018.5.14 XML文档类型定义----DTD
    2018.5.13 oracle遇到的问题
    二元搜索算法(分治法)
    循环队列(弥补队列顺序储存的不足)
    队列的顺序储存
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9427381.html
Copyright © 2011-2022 走看看