노드로 정렬 리스트 만들기
#include <stdio.h>
#include <stdlib.h>
#define max 100
typedef struct Node {
int data;
struct Node* link;
}SortedNode;
typedef SortedNode * SortedNode_ptr;
int get_length(SortedNode_ptr list) {
SortedNode_ptr p = list;
int num = 0;
while (p != NULL) {
p = p->link;
num++;
}
return num;
}
int is_empty(SortedNode_ptr list) {
if (list == NULL)
return 1;
else
return 0;
}
SortedNode_ptr sort(SortedNode_ptr list) {
for (SortedNode_ptr i = list; i->link; i = i->link) {
for (SortedNode_ptr j = i->link; j; j = j->link) {
if (i->data > j->data) {
int tmp = i->data;
i->data = j->data;
j->data = tmp;
}
}
}
return list;
}
SortedNode_ptr clear(SortedNode_ptr list) {
if (!is_empty(list)) {
free(list);
list = NULL;
}
else
printf("리스트가 비어 있음");
return list;
}
int is_in_list(SortedNode_ptr list, int item) {
int idx = -1;
for (SortedNode_ptr i = list; i; i = i->link) {
idx++;
if (i->data == item)
return idx; // item이 있는 인덱스 반환
else if (i->link == NULL) // 마지막 요소까지 Item을 못 찾음
return -1;
}
}
SortedNode_ptr add(SortedNode_ptr list, int item) {
SortedNode_ptr p = (SortedNode_ptr)malloc(sizeof(SortedNode));
p->data = item;
p->link = list;
list = p;
// 오름차순 정렬
sort(list);
return list;
}
SortedNode_ptr delete(SortedNode_ptr list, int item) {
if (!is_empty(list)) {
SortedNode_ptr p;
int tmp; // item이 있으면, item이 있는 노드 인덱스
if ((tmp = is_in_list(list, item)) >= 0) {
if (tmp == 0) { // 첫 번째 노드에 item있으면, delete_first
p = list;
list = p->link;
free(p);
}
else { // 다른 노드에 item있으면, delete
SortedNode_ptr pre = list;
for (int i = 1; i < tmp; i++) {
pre = pre->link;
}
p = pre->link;
pre->link = p->link;
free(p);
}
}
else {
printf("리스트에 해당 item이 없음\n");
}
}
else
printf("리스트가 비어 있음\n");
return list;
}
void display(SortedNode_ptr list) {
printf("\n■ 정렬 리스트의 요소 출력\n");
for (SortedNode_ptr i = list; i; i = i->link)
printf("%d ", i->data);
printf("(size:%d)\n", get_length(list));
}
void gen_array(int a[], int num) {
for (int i = 0; i < num; i++)
a[i] = (rand() % 100) + 1;
}
void print_array(int a[], int num) {
printf("■ 랜덤 배열의 요소 출력\n");
for (int i = 0; i < num; i++)
printf("%d ", a[i]);
printf("\n");
}
SortedNode_ptr gen_sortedList(int a[], int num) {
SortedNode_ptr list = NULL;
for (int i = 0; i < num; i++)
list = add(list, a[i]);
for (SortedNode_ptr i = list; i->link; i = i->link) {
for (SortedNode_ptr j = i->link; j; j = j->link) {
if (i->data > j->data) {
int tmp = i->data;
i->data = j->data;
j->data = tmp;
}
}
}
return list;
}
SortedNode_ptr input_processing(int choice, SortedNode_ptr list) {
int a[max] = { 0 }, num = 0;
scanf_s("%d", &num);
printf(" → 입력:");
for (int i = 0; i < num; i++) {
scanf_s("%d", &a[i]);
}
// choice에 따른 함수 호출
switch (choice) {
case 1:
for (int i = 0; i < num; i++)
list = add(list, a[i]);
break;
case 2:
for (int i = 0; i < num; i++)
list = delete(list, a[i]);
break;
}
return list;
}
int main(void) {
SortedNode_ptr list = NULL;
int choice, item;
while (1) {
printf("■ 정렬 리스트입니다 (1.추가, 2.삭제, 3.출력, 4.모두 삭제):");
scanf_s("%d", &choice);
switch (choice) {
case 1: // 추가
printf(" ");
printf("→ 몇 개를 추가하겠습니까?:");
list = input_processing(1, list);
break;
case 2: // 삭제
printf(" ");
printf("→ 몇 개를 삭제하겠습니까?:");
list = input_processing(2, list);
break;
case 3: // 출력
printf(" → ");
display(list);
break;
case 4: // 모두 삭제
list = clear(list);
printf("\n");
break;
}
}
}

