Circular list를 이용하여 List에 데이터를 넣었다가 빼고, 리스트에 존재하는지 등에 대한 Function들을 작성해보았습니다.

(비교, 단일 LinkedList 사용하기 : http://jwprogramming.tistory.com/230 , 

DoubleLinkedList 사용하기 : http://jwprogramming.tistory.com/232 )


(1) circularlistMain.c

#include <stdio.h>

#include <stdlib.h>

#include "Circularlist.h"


int main(int argc, char* argv[]) {

int i = 0;

int arrayCount = 0;

CircularList * pList = NULL;

CircularListNode * pNode = NULL;

CircularListNode node;

pList = createCircularList();

if (pList != NULL) {

node.data = 1;

addCLElement(pList, 0, node);

node.data = 3;

addCLElement(pList, 1, node);

node.data = 5;

addCLElement(pList, 2, node);

displayCircularList(pList);

removeCLElement(pList, 0);

displayCircularList(pList);

deleteCircularList(pList);

}

return 0;

}


(2) circularlist.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "circularlist.h"


int addCLElement(CircularList* pList, int position, CircularListNode element) {

int ret = FALSE;

int i = 0;

CircularListNode *pPreNode = NULL, *pNewNode = NULL, *pLastNode = NULL;


if (pList != NULL) {

if (position >= 0 && position <= pList->currentElementCount) {

pNewNode = (CircularListNode*)malloc(sizeof(CircularListNode));

if (pNewNode == NULL) {

printf("오류, 메모리할당 addLLElement() \n");

return ret;

}

*pNewNode = element;

pNewNode->pLink = NULL;

if (position == 0) {

if (pList->currentElementCount == 0) {

pList->pLink = pNewNode;

pNewNode->pLink = pNewNode;

}

else {

pLastNode = pList->pLink;

while (pLastNode->pLink != pList->pLink) {

pLastNode = pLastNode->pLink;

}

pList->pLink = pNewNode;

pNewNode->pLink = pLastNode->pLink;

pLastNode->pLink = pNewNode;

}

}

else {

pPreNode = pList->pLink;

for (i = 0; i < position - 1; i++) {

pPreNode = pPreNode->pLink;

}

pNewNode->pLink = pPreNode->pLink;

pPreNode->pLink = pNewNode;

}

pList->currentElementCount++;

ret = TRUE;

}

else {

printf("오류, 위치 인덱스-[%d], addCLElement() \n", position);

}

}


return ret;

}


int removeCLElement(CircularList* pList, int position) {

int ret = FALSE;

int i = 0, arrayCount = 0;

CircularListNode *pPreNode = NULL, *pDelNode = NULL, *pLastNode = NULL;


if (pList != NULL) {

arrayCount = getCircularListLength(pList);

if (position >= 0 && position < arrayCount) {

if (position == 0) {

pDelNode = pList->pLink;

if (arrayCount == 1) {

free(pDelNode);

pList->pLink = NULL;

}

else {

pLastNode = pList->pLink;

while (pLastNode->pLink != pList->pLink) {

pLastNode = pLastNode->pLink;

}

pLastNode->pLink = pDelNode->pLink;

pList->pLink = pDelNode->pLink;

free(pDelNode);

}

}

else {

pPreNode = pList->pLink;

for (i = 0; i < position - 1; i++) {

pPreNode = pPreNode->pLink;

}

pDelNode = pPreNode->pLink;

pPreNode = pDelNode->pLink;

free(pDelNode);

}

pList->currentElementCount--;

ret = TRUE;

}

else {

printf("오류, 위치 인덱스-[%d] removeCLElement() \n", position);

}

}

return ret;

}


CircularListNode* getCLElement(CircularList* pList, int position) {

int i = 0;

CircularListNode* pNode = NULL;

if (pList != NULL) {

if (position >= 0 && position < pList->currentElementCount) {

pNode = pList->pLink;

for (i = 0; i <= position; i++) {

pNode = pNode->pLink;

}

}

}

return pNode;

}


CircularList* createCircularList() {

CircularList *pReturn = NULL;

int i = 0;


pReturn = (CircularList *)malloc(sizeof(CircularList));

if (pReturn != NULL) {

memset(pReturn, 0, sizeof(CircularList));

}

else {

printf("오류, 메모리할당 createCircularList()\n");

return NULL;

}

return pReturn;

}


void displayCircularList(CircularList* pList) {

int i = 0;

if (pList != NULL) {

printf("현재 원소 개수: %d\n", pList->currentElementCount);

for (i = 0; i < pList->currentElementCount; i++) {

printf("[%d], %d\n", i, getCLElement(pList, i)->data);

}

}

else {

printf("원소가 없습니다.\n");

}

}


int getCircularListLength(CircularList* pList) {

int ret = 0;

if (pList != NULL) {

ret = pList->currentElementCount;

}


return ret;

}


void deleteCircularList(CircularList* pList) {

int i = 0;

if (pList != NULL) {

clearCircularList(pList);

free(pList);

}

}


void clearCircularList(CircularList* pList) {

if (pList != NULL) {

if (pList->currentElementCount > 0) {

removeCLElement(pList, 0);

}

}

}


(3) circularlist.h

#ifndef _CIRCULARLIST_

#define _CIRCULARLIST_


typedef struct CircularListNodeType

{

int data;

struct CircularListNodeType* pLink;

} CircularListNode;


typedef struct CircularListType

{

int currentElementCount;

CircularListNode* pLink;

} CircularList;


void displayCircularList(CircularList* pList);

CircularList* createCircularList();

int addCLElement(CircularList* pList, int position, CircularListNode element);

int removeCLElement(CircularList* pList, int position);

void deleteCircularList(CircularList* pList);

void clearCircularList(CircularList* pList);

int getCircularListLength(CircularList* pList);


#endif


#ifndef _COMMON_LIST_DEF_

#define _COMMON_LIST_DEF_

#define TRUE 1

#define FALSE 0


#endif


WRITTEN BY
SiriusJ

,