Data Structure – Sorted List by Node

노드로 정렬 리스트 만들기

#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;
		}
	}
}
( 정상:Normal )
( 비정상:Unnormal )

Leave a Reply

Your email address will not be published. Required fields are marked *