오찌는 도찌인가?

 

우리는 이것에 대해 의문을 가져야 할 필요는 없고

 

그냥 외우면 된다.

 

오찌는 도찌이다.

 

오찌도찌

'일기장' 카테고리의 다른 글

오찌도찌  (39) 2023.04.20

오찌기 도찌기 옷도로 돗돗찌

'일기장' 카테고리의 다른 글

오찌는 도찌입니까?  (1) 2024.08.02

3. 이어서 함수 설명


[ findNode / printNode ]

void findNode(linkedList *L){
	node *f = L->head;
	int i, num;

	printf("찾을 노드 번호를 입력하세요 : ");
	scanf(" %d", &num);

	if (L->cnt <= 0) {
		printf("리스트가 비었음.\n");
		returnMain(L);
	}
	else if (num > L->cnt) {
		printf("검색 위치가 리스트의 길이보다 김.\n");
		returnMain(L);
	}
	else {
		for (i = 1; i < num; i++)
			f = f->next;
		printf("%d 번째 노드의 값 - 이름 : %s 전화번호 : %d\n", num, f->name, f->phone);
		returnMain(L);
	}
}

void printNode(linkedList *L){
	node *f = L->head;

	printf("리스트\n");
	while (f != NULL) {
		printf("이름 : %s 전화번호 : %d\n", f->name, f->phone);
		f = f->next;
	}
	printf("\n노드 수 : %d\n", L->cnt);
	returnMain(L);
}

 - findNode에서도 삽입과 삭제할 때의 경우와 같이 원하는 위치로 찾아가야 한다.

   더미노드 f 를 만들고 반복문으로 찾아간 후, 그 값을 출력한다.


 - printNode에서는 모든 노드를 한번씩 찾아가서 값을 출력해야 하기 때문에, 리스트의 테일까지 찾아간다.

   테일까지 찾아가면서 노드의 값들을 출력한다.



4. 전체 소스 코드

/*
	Phone Book (use Doubly Linked List)
	Coder : GGaShu LSW
	Date : 2018.03.30
	Purpose : 이중연결리스트의 활용
*/

#include 
#include 
#include 

typedef struct _Node {
	struct _Node *prev;
	struct _Node *next;
	int no;
	char name[20];
	int phone;
}node;

typedef struct _linkedList {
	struct _Node *head;
	struct _Node *tail;
	int cnt;
}linkedList;

void printMain(linkedList *L);	// 메인 메뉴 출력
void returnMain(linkedList *L);	// 메인으로 돌아옴
void inputMenu(linkedList *L);	// 메뉴 선택
void inputData(linkedList *L);	// 데이터 입력

void Init(linkedList *L);	// 리스트 초기화
void createNode(linkedList *L, char *ndata, int pdata, int num);	// 노드 생성
void createLastNode(linkedList *L, char *ndata, int pdata);	// 안씀
void deleteNode(linkedList *L);	// 노드 삭제
void deleteLastNode(linkedList *L);	// 안씀
void findNode(linkedList *L);	// 노드 검색
void printNode(linkedList *L);	// 리스트 출력

void main() {
	linkedList *L = (linkedList *)malloc(sizeof(linkedList));
	Init(L);
	printMain(L);
}

void printMain(linkedList *L) {
	printf("1. 리스트\n");
	printf("2. 검  색\n");
	printf("3. 삽  입\n");
	printf("4. 삭  제\n");
	printf("5. 종  료\n");
	printf("메뉴를 골라주세요 : ");
	inputMenu(L);
}

void returnMain(linkedList *L) {
	char c;
	printf("메인으로(Y/y) 종료(N/n) : ");
	
	// scanf 그냥 통과되는 문제 (버퍼를 비우자)
	// 이상하게 fflush(stdin)이 안먹혀서 한칸을 비우고 스캔하는 방법을 사용.
	scanf(" %c", &c);

	if (c == 'Y' || c == 'y') {
		system("cls");
		printMain(L);
	}
	else if (c == 'N' || c == 'n')
		exit(1);
	else {
		printf("잘못 누름. 다시 입력 : ");
		returnMain(L);
	}
}

void inputMenu(linkedList *L) {
	int num = 0;

	scanf("%d", &num);

	if (num > 5 || num < 1) {
		printf("1부터 5까지 중에서 고르세요 : ");
		num = 0;
		scanf(" %d", &num);
	}
	else {
		switch (num) {
		case 1:
			printNode(L);
			break;
		case 2:			
			findNode(L);
			break;
		case 3:
			inputData(L);
			break;
		case 4:
			deleteNode(L);
			break;
		case 5:
			exit(1);
		}
	}
}

void inputData(linkedList *L) {
	char name[20];
	int phone, num;

	printf("순번 이름 전화번호 순으로 입력하세요 : ");
	scanf(" %d %s %d", &num, name, &phone);
	
	createNode(L, name, phone, num);
}

void Init(linkedList *L) {
	L->head = NULL;
	L->tail = NULL;
	L->cnt = 0;
}

void createNode(linkedList *L, char *ndata, int pdata, int num) {
	node *f = L->head;
	node *newNode = (node *)malloc(sizeof(node));
	
	newNode->no = num;
	strcpy(newNode->name, ndata);
	newNode->phone = pdata;
	
	int i;

	if (num <= 0) {
		printf("삽입 위치가 리스트의 길이보다 짧음.\n");
		exit(1);
	}
	else if (num == 1) {
		if (L->head == NULL && L->tail == NULL) {
			printf("헤드\n");
			L->head = newNode;
			L->tail = newNode;
			newNode->next = NULL;

			printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone);
			L->cnt++;

			returnMain(L);
		}
		else {
			printf("헤드뺏기2\n");
			newNode->next = L->head;
			L->head = newNode;
			L->head->next->prev = newNode;
			newNode->prev = L->head;

			printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone);
			L->cnt++;

			returnMain(L);
		}
	}
	else if (num == (L->cnt) + 1) {
		printf("테일\n");
		newNode->prev = L->tail;
		L->tail->next = newNode;
		L->tail = newNode;
		newNode->next = NULL;

		printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone);
		L->cnt++;

		returnMain(L);
	}
	else {
		if (num > (L->cnt) + 2) {
			printf("삽입 위치가 리스트의 길이보다 길다\n");
			exit(1);
		}
		else {
			for (i = 1; i < num - 1; i++)
				f = f->next;
		}

		newNode->next = f->next;
		f->next->prev = newNode;
		newNode->prev = f;
		f->next = newNode;

		printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone);
		L->cnt++;

		returnMain(L);
	}
}

void createLastNode(linkedList *L, char *ndata, int pdata){
	// 일단 사용 안함
}

void deleteNode(linkedList *L){
	node *f = L->head;
	int i, num;

	printf("삭제할 노드 번호를 입력하세요 : ");
	scanf(" %d", &num);

	if (num <= 0) {
		printf("삭제 위치가 리스트의 길이보다 짧다\n");
		deleteNode(L);
	}
	else if (num == 1) {
		L->head = L->head->next;
		
		printf("%d 번째 노드 삭제 완료\n", num);
		L->cnt--;

		returnMain(L);
	}
	else if (num == L->cnt) {
		L->tail = L->tail->prev;
		L->tail->next = NULL;
		
		printf("%d 번째 노드 삭제 완료\n", num);
		L->cnt--;

		returnMain(L);
	}
	else {
		if (num > (L->cnt) + 1) {
			printf("삭제 위치가 리스트의 길이보다 길다\n");
			deleteNode(L);
		}
		else {
			for (i = 1; i < num; i++)
				f = f->next;
		}

		f->prev->next = f->next;
		f->next->prev = f->prev;

		printf("%d 번째 노드 삭제 완료\n", num);
		L->cnt--;

		returnMain(L);
	}
}

void deleteLastNode(linkedList *L){
	// 일단 사용 안함.
}

void findNode(linkedList *L){
	node *f = L->head;
	int i, num;

	printf("찾을 노드 번호를 입력하세요 : ");
	scanf(" %d", &num);

	if (L->cnt <= 0) {
		printf("리스트가 비었음.\n");
		returnMain(L);
	}
	else if (num > L->cnt) {
		printf("검색 위치가 리스트의 길이보다 김.\n");
		returnMain(L);
	}
	else {
		for (i = 1; i < num; i++)
			f = f->next;
		printf("%d 번째 노드의 값 - 이름 : %s 전화번호 : %d\n", num, f->name, f->phone);
		returnMain(L);
	}
}

void printNode(linkedList *L){
	node *f = L->head;

	printf("리스트\n");
	while (f != NULL) {
		printf("이름 : %s 전화번호 : %d\n", f->name, f->phone);
		f = f->next;
	}
	printf("\n노드 수 : %d\n", L->cnt);
	returnMain(L);
}



5. 마치며


 블로그에 글을 정말 오랬만에 쓴다.


 자료구조나 다시 공부해볼 겸 프로그램을 짜고 나서, 갑자기 블로그가 있다는 사실이 생각나 올리게 되었다.


 나도 아직 프로그래밍에 미숙하여 많이 공부중이지만 이 포스트가 다른 사람들에게 도움이 되었으면 좋겠다.


 끝!


 이 아니라 포스팅을 언제 또 다시 할지는 미정...


 진짜 끝!

+ Recent posts