본문 바로가기

C/코드 리뷰

Linked List 구현하기 (2)

반응형
SMALL

저번에 간단하게 Linked List를 구현해봤는데, 삽입, 삭제, 조회 기능을 만들지 못해서 이번에 한꺼번에 코드를 작성해 보았습니다.

#include <stdio.h>
#include <malloc.h>

typedef struct _node {
	int data;
	struct _node* next;
	struct _node* prev;
}Node;

Node* head = NULL;
Node* tail = NULL;
Node* cur = NULL;
Node* newNode = NULL;

void LInsert(int data) {
	newNode = (Node*)malloc(sizeof(Node));
	newNode->data = data;
	newNode->next = NULL;
	newNode->prev = NULL;

	if (head == NULL) {
		head = newNode;
	}
	else {
		tail->next = newNode;
		newNode->prev = tail;
	}
	tail = newNode;
}

void LRead() {
	cur = head;
	while (cur != NULL) {
		printf("%d ", cur->data);
		cur = cur->next;
	}
}

const char* LSearch(int target) {
	cur = head;
	while (cur != NULL) {
		if (cur->data == target) {
			return "찾으시는 값이 존재합니다.";
		}
		cur = cur->next;
	}
	return "찾으시는 값이 존재하지 않습니다.";
}

const char* editNum(int idx, int editData) {
	if (idx < 0) return "인덱스 범위가 벗어났습니다.";
	int cnt = 0;
	cur = head;
	while (cnt != idx && cur != NULL) {
		cnt++;
		cur = cur->next;
	}
	if (cur == NULL) return "인덱스 범위가 벗어났습니다.";
	cur->data = editData;
	LRead();
	printf("\n");
	return "값이 변경되었습니다.";
}

const char* insertNum(int idx, int addData) {
	if (idx < 0) return "인덱스 범위가 벗어났습니다.";
	int cnt = 0;
	cur = head;
	newNode = (Node*)malloc(sizeof(Node));
	newNode->data = addData;
	newNode->next = NULL;
	newNode->prev = NULL;
	while (cnt != idx && cur != NULL) {
		cnt++;
		cur = cur->next;
	}
	if (cur == head) {
		newNode->next = head;
		head->prev = newNode;
		head = newNode;
	}
	else if (cur == NULL) {
		tail->next = newNode;
		newNode->prev = tail;
		tail = newNode;
	}
	else {
		newNode->prev = cur->prev;
		cur->prev->next = newNode;
		cur->prev = newNode;
		newNode->next = cur;
	}
	LRead();
	printf("\n");
	return "값 삽입이 완료되었습니다.";
}

char const* deleteNum(int idx) {
	int cnt = 0;
	cur = head;
	while (cnt != idx && cur != NULL) {
		cnt++;
		cur = cur->next;
	}
	if (cur == head) {
		head = head->next;
		if (head == NULL) return "삭제할 데이터가 없습니다.";
		head->prev = NULL;
	}
	else if (cur == NULL) {
		return "범위를 벗어났습니다.";
	}
	else if (cur == tail) {
		tail = tail->prev;
		tail->next = NULL;
	}
	else {
		cur->prev->next = cur->next;
		cur->next->prev = cur->prev;
	}
	free(cur);
	LRead();
	printf("\n");
	return "삭제가 완료되었습니다.";
}

void allDelete() {
	cur = head;
	while (cur != NULL) {
		head = cur->next;
		free(cur);
		cur = head;
	}
}

int main(void) {
	int readData;
	int idx;

	// 입력
	printf("하나의 자연수를 입력해주세요(0을 입력하면 입력이 종료됩니다)\n");
	while (1) {
		printf("입력 => ");
		scanf("%d", &readData);

		if (readData == 0) break;

		LInsert(readData);
	}
	
	if (head == NULL) {
		printf("입력된 값이 존재하지 않습니다.");
		return 0;
	}

	// 조회
	printf("저장된 데이터입니다.\n");
	LRead();
	printf("\n");

	// 찾기
	printf("찾으시려는 자연수를 입력해주세요(0을 입력하면 입력이 종료됩니다)\n");
	while (1) {
		printf("입력 => ");
		scanf("%d", &readData);

		if (readData == 0) break;

		printf("%s %d\n", LSearch(readData), readData);
	}

	// 수정
	printf("수정하려는 인덱스와 데이터를 입력해주세요\n");
	LRead();
	printf("\n");
	while (1) {
		printf("인덱스(-1을 입력하면 입력이 종료됩니다) => ");
		scanf("%d", &idx);
		if (idx == -1) break;
		printf("숫자 => ");
		scanf("%d", &readData);

		printf("%s\n", editNum(idx, readData));
	}

	// 삽입
	printf("삽입하려는 인덱스와 데이터를 입력해주세요\n");
	LRead();
	printf("\n");
	while (1) {
		printf("인덱스(-1을 입력하면 입력이 종료됩니다) => ");
		scanf("%d", &idx);
		if (idx == -1) break;
		printf("숫자 => ");
		scanf("%d", &readData);

		printf("%s\n", insertNum(idx, readData));
	}

	// 삭제
	printf("삭제하려는 인덱스와 데이터를 입력해주세요\n");
	LRead();
	printf("\n");
	while (1) {
		printf("인덱스(-1을 입력하면 입력이 종료됩니다) => ");
		scanf("%d", &idx);
		if (idx == -1) break;

		printf("%s\n", deleteNum(idx));
		if (head == NULL) break;
	}

	// 프로그램 종료
	printf("프로그램을 종료합니다.");
	allDelete();
}

더블 링크드리스트를 사용했습니다. 왜 더블링크드리스트를 썼는지는... 저도 잘 모르겠지만, 그냥 그러고 싶어서 작성해 보았습니다.

 

혹여나 코드에서 버그를 발견하시는 분께서는 댓글을 남겨주시면 감사하겠습니다.


이상 Linked List 구현하기 (2)였습니다.

반응형
LIST

'C > 코드 리뷰' 카테고리의 다른 글

Tree 구현하기  (0) 2020.01.29
C언어 순열과 조합  (0) 2020.01.11
우선순위 큐 구현  (0) 2019.08.15
큐 구현 (원형 큐)  (0) 2019.08.15
스택 구현  (0) 2019.08.15