본문 바로가기

C\C++

Linked List 회원관리 프로그램

개요

Linked list 자료 구조를 이용하여 회원관리를 위한 프로그램 작성

Code

 

- Main 함수 -

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include"DLL.h"

int main(void)
{
	NODE_t* ptrHeadNode = initailize_DLL();
	menuSelect(ptrHeadNode);
	free(ptrHeadNode);
	return 0;
}

 

- 사용자 정의 함수 "DLL.h" -

//#pragma once

#define U_SIZEOF (unsigned)sizeof
#define _LINE linePrint()
#define STRMAX 20

typedef struct MEM {
	char name[STRMAX];
	int age;
	char phone[STRMAX];
	struct MEM* prev;
	struct MEM* next;
}NODE_t;

NODE_t* initailize_DLL();
NODE_t* new_node(void);
void append_node(NODE_t* headNode);
void insert_node(NODE_t* headNode);
void delete_node(NODE_t* headNode);
void search_node(NODE_t* headNode);
void linePrint(void);
void mmPrint(NODE_t* ptrNode,char arr[]);
void menuSelPrint(void);
void print_node(NODE_t* pri_n);
void menuSelect(NODE_t* headNode);
void menuTop(char arr[]);

void menuSelect(NODE_t* headNode)
{
	int iMenuSel;
	do {
		mmPrint(headNode,"회원관리 프로그램");
		menuSelPrint();
		printf(">> ");
		scanf_s("%d", &iMenuSel);
		switch (iMenuSel) {
		case 1:
			append_node(headNode);
			break;
		case 2:
			insert_node(headNode);
			break;
		case 3:
			delete_node(headNode);
			break;
		case 4:
			search_node(headNode);
			break;
		case 0:
			puts("프로그램을 종료합니다.");
			break;
		default:
			puts("잘못된 명령입니다.");
			break;
		}
	} while (iMenuSel);
}

NODE_t* initailize_DLL(void)
{
	NODE_t* head = NULL;
	head = (NODE_t*)calloc(1, U_SIZEOF(NODE_t));
	strcpy_s(head->name, U_SIZEOF(head->name), "headNode");
	return head;
}


NODE_t* new_node(void)
{
	system("cls");
	menuTop("회원등록");
	NODE_t* newPtr = (NODE_t*)calloc(1, U_SIZEOF(NODE_t));
	printf("이름을 입력하세요 : ");
	scanf_s("%s", newPtr->name, U_SIZEOF(newPtr->name));
	printf("나이를 입력하세요 : ");
	scanf_s("%d", &newPtr->age);
	printf("전화번호를 입력하세요 : ");
	scanf_s("%s", newPtr->phone, U_SIZEOF(newPtr->phone));
	puts("메인으로 돌아갑니다.\n");
	Sleep(500);
	system("cls");
	return newPtr;
}

void append_node(NODE_t* headNode)
{
	NODE_t*	app_n = headNode;
	while (app_n->next!=NULL)
	{
		app_n = app_n->next;
	}
	app_n->next = new_node();
	app_n->next->prev = app_n;
}

void insert_node(NODE_t* headNode)
{
	int index = 0;
	NODE_t* newPtr = NULL;
	if (headNode->next == NULL) {
		append_node(headNode);
	}
	else {
		system("cls");
		mmPrint(headNode, "회원 삽입");
		printf("삽입할 순번을 입력하세요 : ");
		scanf_s("%d", &index);
		//new_node로 정보입력
		newPtr = new_node();
		//삽입할 순번만큼 pointer를 이동시킴
		newPtr->next = headNode->next;
		newPtr->prev = headNode;
		for (int i = 1; i < index; i++) {
			newPtr->prev = newPtr->prev->next;
			newPtr->next = newPtr->next->next;
		}
		//삽입할 node.prev에 preNode 연결 node.next에 nextNode를 연결
		if (newPtr->next != NULL) {
			newPtr->prev->next = newPtr;
			newPtr->next->prev = newPtr;
		}
		else {//마지막 노드에 삽입할 시 prenode.next를 삽입할 노드에 연결
			newPtr->prev->next = newPtr;
		}
		puts("메인으로 돌아갑니다.\n");
		Sleep(500);
		system("cls");
	}
}

void delete_node(NODE_t* headNode)
{
	int index = 0;
	NODE_t* ptrSear = headNode;
	system("cls");
	mmPrint(headNode,"회원삭제");
	if (headNode->next==NULL){
		printf("\t회원이 없어 삭제 할수 없습니다.");
	}
	else {
		printf("삭제할 회원의 순번을 입력하세요 : ");
		scanf_s("%d", &index);
		//headNode 다음 node를 pointing 
		ptrSear = ptrSear->next;
		for (int i = 1; i < index; i++) {//index만큼 포인터 이동
			ptrSear = ptrSear->next;
		}
		if (ptrSear->next!=NULL){
		ptrSear->prev->next = ptrSear->next;//삭제할 node의 next를 nextnode에 연결
		ptrSear->next->prev = ptrSear->prev;//삭제할 node의 prev를 prenode에 연결
		}
		else{//삭제할 노드가 tailnode이면 preNode.next = NULL
			ptrSear->prev->next = NULL;
		}
		//삭제할 node의 pointer link 삭제
		ptrSear->next = NULL;
		ptrSear->prev = NULL;
		free(ptrSear);
	}
	system("cls");
}

void search_node(NODE_t* headNode) //headNode로 call
{
	NODE_t* arrSearch[] = { 0 }, *sear_n=headNode;
	char strSearching[STRMAX] = { 0 };
	int iCnt = 0;
	system("cls");
	_LINE;
	puts("검색할 회원명을 입력하세요 ");
	printf(">> ");
	scanf_s("%s", strSearching, U_SIZEOF(strSearching));
	system("cls");
	while (sear_n->next != NULL) { //headNode에서부터 이동하면서 이름을 비교
		sear_n = sear_n->next;
		if (strcmp(sear_n->name, strSearching) == 0){
			arrSearch[iCnt++] = sear_n;
		}
	}
	if (iCnt == 0) { puts("\t검색결과가 없습니다."); }
	else {
		puts("순번\t이름\t\t나이\t\t전화번호");
		_LINE;
			for (int j = 0; j < iCnt; j++){
				printf("%02d\t%s\t\t%d\t\t%s\n",
					j + 1, arrSearch[j]->name, arrSearch[j]->age, arrSearch[j]->phone);
			}
	}
	_LINE;
	puts("아무키나 누르면 메인메뉴로 이동합니다.");
	getchar();
	getchar();
	system("cls");
}

void print_node(NODE_t* pri_n)	//headNode.nextnode로 call
{
	int index = 1;
	while (pri_n != NULL) {
		printf("%02d\t%s\t\t%d\t\t%s\n", index++, pri_n->name, pri_n->age, pri_n->phone);
		pri_n = pri_n->next;
	}
}

void linePrint(void)
{
	puts("=====================================================");
}

void mmPrint(NODE_t* ptrNode,char arr[])
{
	_LINE;
	printf("\t\t%s\n", arr);
	_LINE;
	_LINE;
	puts("순번\t이름\t\t나이\t\t전화번호");
	_LINE;
		if (ptrNode->next==NULL){
			puts("\t등록된 회원이 없습니다.");
		}
		else {
			print_node(ptrNode->next);
		}
	_LINE;
}

void menuSelPrint(void)
{
	puts(" 1 : 회원 등록");
	puts(" 2 : 회원 삽입");
	puts(" 3 : 회원 삭제");
	puts(" 4 : 회원 검색");
	puts(" 0 : 종료");
}

void menuTop(char arr[])
{
	_LINE;
	printf("\t\t%s\n", arr);
	_LINE;
}

Output

'C\C++' 카테고리의 다른 글

도서관리 프로젝트  (0) 2022.03.16
malloc, realloc 예제  (0) 2022.03.03
포인터 문제  (0) 2022.03.02
배열 문제  (0) 2022.03.02
구조체 문제  (0) 2022.03.02