기계는 거짓말하지 않는다

링크드 리스트(Linked List) 본문

C

링크드 리스트(Linked List)

KillinTime 2020. 12. 12. 00:02
#include <stdio.h>
#include <stdlib.h>

typedef enum eSelectMenu {
	selectAdd = 1,
	selectDelete,
	selectPrint,
	selectExit
} eSelectMenu;

typedef enum eBool {
	false,
	true
} eBool;

typedef struct Node {
	int data;
	struct Node* link;
} Node;

void PrintLinkedList(Node* head) {
	if (head == NULL) {
		printf("List Empty");
		return;
	}

	for (; head != NULL; head = head->link) {
		printf("%d ", head->data);
	}
}

void AddLinkedListData(Node** head, Node** tail, int data) {
	Node* temp = (Node*)malloc(sizeof(Node));

	if (temp == NULL) {
		fprintf(stderr, "Memory allocation failure\n\n");
		return;
	}
	temp->data = data;
	temp->link = NULL;

	if (*head == NULL) {
		*head = temp;
		*tail = *head;
	}
	else {
		(*tail)->link = temp;
		*tail = temp;
	}
}

void DeleteLinkedListData(Node** head, int data) {
	if (*head == NULL) {
		printf("List Empty\n");
		return;
	}

	eBool deleteCheck = false;
	Node* tempHead, *tempNode;

	tempHead = *head;
	if ((*head)->data == data) {	// deleteData == head data
		*head = (*head)->link;
		free(tempHead);
		deleteCheck = true;
	}
	else {
		for (; tempHead->link != NULL; tempHead = tempHead->link) {
			if (tempHead->link->data == data) {
				tempNode = tempHead->link;
				tempHead->link = tempHead->link->link;

				free(tempNode);
				deleteCheck = true;
				break;
			}
		}
	}

	if (deleteCheck == false) printf("No such element\n");
	else printf("Delete complete\n");
}

int main(void) {
	eSelectMenu select;
	Node* head, *tail;
	int data;

	head = NULL;
	tail = NULL;

	while (1) {
		printf("1. add / 2. delete / 3. print / 4. exit\n");
		printf("select: ");
		scanf_s("%d", &select);

		switch (select) {
		case selectAdd:
			printf("data: ");
			scanf_s("%d", &data);
			AddLinkedListData(&head, &tail, data);
			printf("\n");
			break;
		case selectDelete:
			printf("delete data: ");
			scanf_s("%d", &data);
			DeleteLinkedListData(&head, data);
			printf("\n");
			break;
		case selectPrint:
			PrintLinkedList(head);
			printf("\n\n");
			break;
		case selectExit:
			printf("Exit Program\n");
			return 0;
		default:
			printf("re\n\n");
		}
		while (getchar() != '\n') {}
	}
}

가장 뒤에 데이터가 계속 붙는 간단한 링크드 리스트 예. 다방면으로 응용 가능

'C' 카테고리의 다른 글

free 함수의 할당된 메모리 크기 판별  (0) 2021.05.10
이중 연결 리스트(Doubly Linked List)  (0) 2021.04.25
원형 큐(Circular Queue)  (0) 2020.12.09
스택(Stack)  (0) 2020.12.09
Short Circuit Evaluation(SCE, 단축 평가)  (0) 2020.12.06
Comments