개요
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