#include "CircularDoublyLinkedList.h"
int main(void){
int i=0;
int Count=0;
Node* List=NULL;
Node* Current=NULL;
Node* NewNode=NULL;
for(i=0; i<5; i++){
NewNode=CDLL_CreateNode(i);
CDLL_AppendNode(&List, NewNode);
}
Count=CDLL_GetNodeCount(List);
for(i=0; i<Count; i++){
Current=CDLL_GetNodeAt(List, i);
printf("List[%d] : %d\n", i, Current->Data);
}
printf("\nInserting 3000 After [2]...\n\n");
Current=CDLL_GetNodeAt(List, 2);
NewNode=CDLL_CreateNode(3000);
CDLL_InsertAfter(Current, NewNode);
printf("\nRemoving Node at 2...\n");
Current=CDLL_GetNodeAt(List, 2);
CDLL_RemoveNode(&List, Current);
CDLL_DestroyNode(Current);
Count=CDLL_GetNodeCount(List);
for(i=0; i<Count*2; i++){
if(i==0){
Current=List;
}
else{
Current=Current->NextNode;
}
printf("List[%d] : %d\n", i, Current->Data);
}
printf("\nDestroying List...\n");
Count=CDLL_GetNodeCount(List);
for(i=0; i<Count; i++){
Current=CDLL_GetNodeAt(List, 0);
if(Current!=NULL){
CDLL_RemoveNode(&List, Current);
CDLL_DestroyNode(Current);
}
}
return 0;
}
#include "CircularDoublyLinkedList.h"
Node* CDLL_CreateNode(ElementType NewData){
Node* NewNode=(Node*)malloc(sizeof(Node));
NewNode->Data=NewData;
NewNode->PrevNode=NULL;
NewNode->NextNode=NULL;
return NewNode;
}
void CDLL_DestroyNode(Node* Node){
free(Node);
}
void CDLL_AppendNode(Node** Head, Node* NewNode){
if((*Head)==NULL){
*Head=NewNode;
(*Head)->NextNode=*Head;
(*Head)->PrevNode=*Head;
}
else{
Node* Tail=(*Head)->PrevNode;
Tail->NextNode->PrevNode=NewNode;
Tail->NextNode=NewNode;
NewNode->NextNode=(*Head);
NewNode->PrevNode=Tail;
}
}
void CDLL_InsertAfter(Node* Current, Node* NewNode){
NewNode->NextNode=Current->NextNode;
NewNode->PrevNode=Current;
if(Current->NextNode!=NULL){
Current->NextNode->PrevNode=NewNode;
Current->NextNode=NewNode;
}
}
void CDLL_RemoveNode(Node** Head, Node* Remove){
if(*Head==Remove){
(*Head)->PrevNode->NextNode=Remove->NextNode;
(*Head)->NextNode->PrevNode=Remove->PrevNode;
*Head=Remove->NextNode;
Remove->PrevNode=NULL;
Remove->NextNode=NULL;
}
else{
Remove->PrevNode->NextNode=Remove->NextNode;
Remove->NextNode->PrevNode=Remove->PrevNode;
Remove->PrevNode=NULL;
Remove->NextNode=NULL;
}
}
Node* CDLL_GetNodeAt(Node* Head, int Location){
Node* Current=Head;
while(Current!=NULL&&(--Location)>=0){
Current=Current->NextNode;
}
return Current;
}
int CDLL_GetNodeCount(Node* Head){
unsigned int Count=0;
Node* Current=Head;
while(Current!=NULL){
Current=Current->NextNode;
Count++;
if(Current==Head){
break;
}
}
return Count;
}
void PrintNode(Node* _Node){
if(_Node->PrevNode==NULL){
printf("Prev:NULL");
}
else{
printf("Prev:%d", _Node->PrevNode->Data);
printf("Current:%d", _Node->Data);
}
if(_Node->NextNode==NULL){
printf("Next:NULL\n");
}
else{
printf("Next:%d\n", _Node->NextNode->Data);
}
}
#ifndef CIRCULAR_DOUBLY_LINKEDLIST_H
#define CIRCULAR_DOUBLY_LINKEDLIST_H
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct tagNode{
ElementType Data;
struct tagNode* PrevNode;
struct tagNode* NextNode;
}Node;
Node* CDLL_CreateNode(ElementType NewData);
void CDLL_DestroyNode(Node* Node);
void CDLL_AppendNode(Node** Head, Node* NewNode);
void CDLL_InsertAfter(Node* Current, Node* NewNode);
void CDLL_InsertNewHead(Node** Head, Node* NewHead);
void CDLL_RemoveNode(Node** Head, Node* Remove);
Node* CDLL_GetNodeAt(Node* Head, int Location);
int CDLL_GetNodeCount(Node* Head);
#endif