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;
    }
  • 相关阅读:
    ubuntu12.04 死机 卡屏 画面冻结解决方案
    Install Firefox 20 in Ubuntu 13.04, Ubuntu 12.10, Ubuntu 12.04, Linux Mint 14 and Linux Mint 13 by PPA
    ListView1.SelectedItems.Clear()
    android studio 下载地址
    jquery.slider.js jquery幻灯片测试
    jquery.hovermenu.js
    jquery.tab.js选项卡效果
    适配 placeholder,jquery版
    jquery.autoscroll.js jquery自动滚动效果
    将 Google Earth 地图集成到自己的窗体上的 简单控件
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9427381.html
Copyright © 2011-2022 走看看