노드로 정렬 리스트 만들기
#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; } } }