#include#include 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 ListHeadstruct 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;}