循环双链表

#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\n",test,ListHead -> Next -> Element);
    printf("%d\n",ListHead -> Next -> Next -> Element);
    //printf("%d\n",ListHead -> Next -> Next -> Next -> Element);
    test = DoubleCircularListNodeDelete(2,ListHead);
    printf("test = %d %d\n",test,ListHead -> Next -> Next -> Element);
    //printf("%d\n",ListHead -> Next -> Next -> Next -> Element);
    //printf("%d\n",DoubleCircularListNodeFind(3,ListHead)->Element);
    DoubleCircularListDelete(ListHead);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Asurudo/p/9427381.html