본문 바로가기
C/알고리즘

[C] 이중 연결 리스트

by 덤더리덤떰 2024. 2. 6.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct _NODE_ {
	int data;
	struct _NODE_* llink;
	struct _NODE_* rlink;
}NODE;

typedef struct _LINKED_LIST_ {
	NODE* head;
}LINKED_LIST;

LINKED_LIST* createLinkedList() {
	LINKED_LIST* CL = (LINKED_LIST*)calloc(1, sizeof(LINKED_LIST));
	assert(CL != NULL);

	return CL;
}

void insertFirstNode(LINKED_LIST* CL, int x) {
	NODE* newNode = (NODE*)calloc(1, sizeof(NODE));
	assert(newNode != NULL);
	newNode->data = x;
	if (CL->head == NULL) {
		
		CL->head = newNode;
	}
	else {
		NODE* curNode = CL->head;
		newNode->rlink = CL->head;
		curNode->llink = newNode;
		CL->head = newNode;
	
	}
}

void insertNode(LINKED_LIST* CL, NODE* pre, int x) {
	NODE* newNode = (NODE*)calloc(1, sizeof(NODE));
	assert(newNode != NULL);
	newNode->data = x;
	if (CL->head == NULL) {
		CL->head = newNode;
		
	}
	else if (pre == NULL) {
		return;
	}
	else {
		if (pre->rlink == CL->head) {
			// 맨 마지막
			pre->rlink = newNode;
			newNode->llink = pre;
			
		}
		else {
			NODE* cur = pre->rlink;
			cur->llink = newNode;
			pre->rlink = newNode;
			newNode->rlink = cur;
		}
	}
}

void deleteNode(LINKED_LIST* CL, NODE* old) {
	if (CL->head == NULL || old == NULL) {
		fprintf(stderr, "삭제할 노드가 존재하지 않습니다\n");
	}
	else {
		NODE* pre = CL->head;
		NODE* cur = CL->head;
		//첫번째 노드가 삭제할 노드인 경우
		if (pre->data == old->data) {
			pre->rlink->llink = NULL;
			CL->head = pre->rlink;
			free(old);
			old = NULL;
		}
		else {
			cur = cur->rlink;
			while (cur->data != old->data) {
				pre = cur;
				cur = cur->rlink;
			}
				pre->rlink = cur->rlink;
				free(old);
				old = NULL;
		
		}
	}
}

void printList(LINKED_LIST* CL) {
	NODE* cur = CL->head;
	printf("\n\n***********이중 연결 리스트 출력*******\n");
	while (cur != NULL) {
		printf("%d ", cur->data);
		cur = cur->rlink;
	}
	printf("\n");
}

NODE* searchNode(LINKED_LIST* CL, int x) {
	if (CL->head == NULL) {
		return NULL;
	}
	else {
		NODE* cur = CL->head;
		if (cur->data == x) {
			return cur;
		}
		else {
			cur = cur->rlink;
			int i = 1;
			while (cur != NULL) {
				printf("\nSearch try %d\n", i++);
				if (cur->data == x) {
					return cur;
				}
				else {
					cur = cur->rlink;
				}
			}


			return NULL;
		}
	}
}

NODE* searchNode2(LINKED_LIST* CL, NODE* from, int x) {
	NODE* cur = from;
	if (CL->head == NULL) {
		return NULL;
	}
	else {
		int i = 1;
		while (cur != NULL) {
			printf("\nSearch try %d\n", i++);
			if (cur->data == x) {
				return cur;
			}
			else {
				cur = cur->rlink;
			}
		}
		return NULL;
	}
}

int main() {

	int i;
	int data;
	LINKED_LIST* CL;
	NODE* p;

	srand((unsigned int)time(NULL));

	CL = createLinkedList();
	printf("(1) 원형 연결 리스트 생성하기 \n");

	

	printf("\n\n(2) InsertFirstNode를 이용하여 원형 연결 리스트에 데이터 노드 삽입\n");

	for (i = 1; i < 11; i++) {
		insertFirstNode(CL, i);
	}

	printList(CL);
	getchar();

	printf("\n(3) 5 탐색\n");
	p = searchNode(CL, 5);
	getchar();

	printf("\n(4) 4 재탐색\n");
	p = searchNode2(CL, p, 4);
	getchar();
	

	printf("(5) 4 이후에 100 넣기\n");
	insertNode(CL, p, 100);
	printList(CL);
	getchar();


	printf("(6) 10, 100, 9 순서대로 삭제\n");
	printf("\n1) 10 찾고 삭제연산 수행\n");
	p = searchNode(CL, 10);
	deleteNode(CL, p);
	printList(CL);

	printf("\n2) 100 찾고 삭제연산 수행\n");
	p = searchNode(CL, 100);
	deleteNode(CL, p);
	printList(CL);


	printf("\n3) 9 찾고 삭제연산 수행\n");
	p = searchNode(CL, 9);
	deleteNode(CL, p);
	printList(CL);



	getchar();


	printf("Done\n");



	getchar();
	return 0;
}

'C > 알고리즘' 카테고리의 다른 글

[C] 정렬 알고리즘  (0) 2024.02.12
[C] 이진 탐색 트리 (BST)  (0) 2024.02.08
[C] AVL TREE  (0) 2023.12.10
[C] Prim Alogrithm  (0) 2023.10.06
[C]수식 트리 - Evaluate Tree  (0) 2023.09.22