반응형
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 |