컴공 일기26
게시글 주소: https://dev.orbi.kr/00056750352
이 작업은 아마 모레 즈음 가야 끝나지 않을까 하는데, 약 300라인이 넘어가는 Single Linked List라는 자료구조를 구현한 것입니다. 이걸 이제, "객체화"시키려고 해요. 이게 꽤 어려운 작업일 듯 합니다. 이 코드는 C 기반으로 작성된 것이기 때문에 프로그램 기본 접근단위는 "함수"입니다. 하지만 파이썬, JAVA, C++같은 객체지향 프로그램에서 프로그램의 기본 단위는 함수가 아니라 "객체"죠. 그러므로, 이 코드를 객체화 시켜야 C++과 같은 언어에서 높은 사용가치를 기대해볼 수 있습니다.(물론 STL에서 이미 있는 건데, 개발지망생이 예제 구현하는 것은 실력 증진을 위한 길이니 양해를..)
이 상황을 더 직관적인 비유로 들자면, cm였던 것을 m로 도량형을 바꾸어야 하는 상황입니다. 이 작업을 잘 하는 것이 "객체지향형 개발자"의 덕목이겠죠.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
/////////////////////////////////////////////////////////////////////////
// 주소록이 저장될 데이터 파일
#define DATA_FILE_NAME "Address.dat"
/////////////////////////////////////////////////////////////////////////
void ReleaseList();
/////////////////////////////////////////////////////////////////////////
typedef struct _USERDATA
{
char szName[32]; // 이름
char szPhone[32]; // 전화번호
struct _USERDATA *pNext;
} USERDATA;
// 더미 헤드 노드 선언 및 정의
USERDATA g_Head = { 0 };
//입력 초기화
void flush_stdin() {
while (getchar() != '\n');
}
/////////////////////////////////////////////////////////////////////////
// 리스트에서 이름으로 특정 노드를 검색하는 함수
USERDATA *FindNode(char *pszName)
{
USERDATA *pTmp = g_Head.pNext;
while (pTmp != NULL) {
if (strcmp(pTmp->szName, pszName) == 0)
return pTmp;
// 다음 노드로 이동
pTmp = pTmp->pNext;
}
// 일치하는 데이터를 찾지 못한 경우
return NULL;
}
/////////////////////////////////////////////////////////////////////////
int AddNewNode(char *pszName, char *pszPhone)
{
USERDATA *pNewUser = NULL;
// 같은 이름이 이미 존재하는지 확인한다.
if (FindNode(pszName) != NULL)
return 0;
// 메모리를 확보한다.
pNewUser = (USERDATA*)malloc(sizeof(USERDATA));
memset(pNewUser, 0, sizeof(USERDATA));
// 메모리에 값을 저장한다.
sprintf_s(pNewUser->szName, sizeof(pNewUser->szName), "%s", pszName);
sprintf_s(pNewUser->szPhone, sizeof(pNewUser->szPhone), "%s", pszPhone);
pNewUser->pNext = NULL;
// 더미 노드 바로 뒤에 붙인다. 따라서 가장 최근에
// 추가한 데이터가 가장 앞쪽에 온다.
pNewUser->pNext = g_Head.pNext;
g_Head.pNext = pNewUser;
return 1;
}
/////////////////////////////////////////////////////////////////////////
// 이름을 입력받아 리스트에 추가하는 함수
void Add()
{
char szName[32] = { 0 };
char szPhone[32] = { 0 };
printf("Input name : ");
flush_stdin();
gets_s(szName, sizeof(szName));
printf("Input phone number : ");
gets_s(szPhone, sizeof(szPhone));
// 실제로 리스트에 추가한다.
AddNewNode(szName, szPhone);
}
/////////////////////////////////////////////////////////////////////////
// 특정 노드를 검색하는 함수
void Search()
{
char szName[32] = { 0 };
USERDATA *pNode = NULL;
printf("Input name : ");
flush_stdin();
gets_s(szName, sizeof(szName));
pNode = FindNode(szName);
if (pNode != NULL) {
printf("[%p] %s\t%s [%p]\n",
pNode,
pNode->szName, pNode->szPhone,
pNode->pNext);
}
else {
puts("ERROR: 데이터를 찾을 수 없습니다.");
}
_getch();
}
/////////////////////////////////////////////////////////////////////////
// 리스트에 들어있는 모든 데이터를 화면에 출력하는 함수
void PrintAll()
{
USERDATA *pTmp = g_Head.pNext;
while (pTmp != NULL) {
printf("[%p] %s\t%s [%p]\n",
pTmp,
pTmp->szName, pTmp->szPhone,
pTmp->pNext);
pTmp = pTmp->pNext;
}
_getch();
}
/////////////////////////////////////////////////////////////////////////
// 특정 노드를 검색하고 삭제하는 함수
int RemoveNode(char *pszName)
{
USERDATA *pPrevNode = &g_Head;
USERDATA *pDelete = NULL;
while (pPrevNode->pNext != NULL) {
pDelete = pPrevNode->pNext;
if (strcmp(pDelete->szName, pszName) == 0) {
pPrevNode->pNext = pDelete->pNext;
free(pDelete);
return 1;
}
pPrevNode = pPrevNode->pNext;
}
return 0;
}
/////////////////////////////////////////////////////////////////////////
// 이름을 입력받아 자료를 검색하고 삭제하는 함수
void Remove()
{
char szName[32] = { 0 };
printf("Input name : ");
flush_stdin();
gets_s(szName, sizeof(szName));
RemoveNode(szName);
}
/////////////////////////////////////////////////////////////////////////
// 메뉴를 출력하는 UI 함수
int PrintUI()
{
int nInput = 0;
system("cls");
printf("[1] Add\t [2] Search\t [3] Print all\t [4] Remove\t [0] Exit\n:");
// 사용자가 선택한 메뉴의 값을 반환한다.
scanf_s("%d", &nInput);
return nInput;
}
/////////////////////////////////////////////////////////////////////////
// 데이터 파일에서 노드들을 읽어와 리스트를 완성하는 함수
int LoadList(char *pszFileName)
{
FILE *fp = NULL;
USERDATA user = { 0 };
fopen_s(&fp, pszFileName, "rb");
if (fp == NULL)
return 0;
ReleaseList();
while (fread(&user, sizeof(USERDATA), 1, fp))
AddNewNode(user.szName, user.szPhone);
fclose(fp);
return 0;
}
/////////////////////////////////////////////////////////////////////////
// 리스트 형태로 존재하는 정보를 파일에 저장하는 함수
int SaveList(char *pszFileName)
{
FILE *fp = NULL;
USERDATA *pTmp = g_Head.pNext;
fopen_s(&fp, pszFileName, "wb");
if (fp == NULL) {
puts("ERROR: 리스트 파일을 쓰기 모드로 열지 못했습니다.");
_getch();
return 0;
}
while (pTmp != NULL) {
if (fwrite(pTmp, sizeof(USERDATA), 1, fp) != 1)
printf("ERROR: %s에 대한 정보를 저장하는데 실패했습니다.\n", pTmp->szName);
pTmp = pTmp->pNext;
}
fclose(fp);
return 1;
}
/////////////////////////////////////////////////////////////////////////
// 리스트의 모든 데이터를 삭제하는 함수
void ReleaseList()
{
USERDATA *pTmp = g_Head.pNext;
USERDATA *pDelete = NULL;
while (pTmp != NULL) {
pDelete = pTmp;
pTmp = pTmp->pNext;
free(pDelete);
}
memset(&g_Head, 0, sizeof(USERDATA));
}
/////////////////////////////////////////////////////////////////////////
void main()
{
int nMenu = 0;
LoadList(DATA_FILE_NAME);
// 메인 이벤트 반복문
while ((nMenu = PrintUI()) != 0) {
switch (nMenu) {
case 1: // Add
Add();
break;
case 2: // Search
Search();
break;
case 3: // Print all
PrintAll();
break;
case 4: // Remove
Remove();
break;
}
}
// 종료 전에 파일로 저장하고 메모리를 해제한다.
SaveList(DATA_FILE_NAME);
ReleaseList();
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
오르비문학 1화 0 0
오르비문학 1화
-
Test 0 0
Tetsteyey
-
수학 4등급만 받으면 2 0
쫀득하게 인서울 할 수 있는데
-
엘든링 왜 자꾸 멈추지 1 0
컴퓨터 좋은건데 씨발
-
목 졸라줘 5 1
켁켁켁 숨막혀 ㅜㅜ
-
시험지에 따라서 난이도가 가장 극단적으로 달라지는 번호같음....
-
개쉽게 풀리는데 이거 맞나
-
정시로 갑시다 8 0
내신반영을 노려서 내신 깡패 정시러
-
나왔어 12 0
다시감 근데 저게 왜 이륙햇냐
-
갑자기생각난썰 1 1
고1 2학기 학급회장선거때 후보가 2명이엇는데 그 친구들 둘이 합의하고 한명이...
-
그만하고 잘까 1 0
흐름이 끊겨버렷네
-
세기말 수능 1 1
2000학년도 대학수학능력시험
-
강은양t 0 0
현역 고3이고 작년까지 모고 3~4등급 나왔는데 지금부터 강은양t 들으려고 합니다....
-
2시열차 1 0
출발
-
지금 강민철 현강 다니고 있는데 저랑 너무 안맞는 느낌이 심하게 들어서...
-
뭘 해야하나요 0 0
이번에 고등학교 2학년 된 이공계 지망하는 지방 일반고학생입니다. 생기부를 제대로...
-
이게 오르비를 재밌게 오래하려면 10 4
수험생활을 지속해야 함
-
에ㅔㅔㅔㅔㅔㅔㄴ들리스레인ㄴㄴ 0 1
폴온마이헐트 코코로노 키즈니ㅣㅣㅣ
-
내 이상형 중단발에 속눈썹 1 0
-
우와 보추야동 많이떴다 2 2
보다자야지
-
심심한데 무물보 5 0
응애 나 아가학생
-
본인 물1 점수 꼬라지 0 1
3모 48점 (99) 5더프 47점인가였는데 시험이 어려웠어서 전국석차 30등쯤...
-
오후8시부터자다가깼더니 1 0
다시잠이안오네.. 비상..!!
-
생각나는구나
-
ㅇㄴ근데 0학점 패논패과목을 오ㅑㄹ케 빡세게시켜 0 0
그냥 좀 봐주면 안되나
-
시발점 한 다음 스블 0 0
고2이고대수 개념원리, 쎈, 고쟁이 했습니다개정 시발점 사놓은 게 있어서...
-
러셀 외부생 더프 성적표 0 0
문자로 발송되나요?? 아님 직접 찾으러 가야햐나요??
-
원래 사람은 별을 쫓아 달려갈 때 가장 빛나는 법이여설령 닿지 못할지라도적어도 내...
-
저걸 어케 함 진짜 와.. 원과목 중 생1만 수능공부로 안해봤는데 안하길잘한듯
-
시발 나 개폐급임 2 1
조별과제 하는족족 내것만 교수님 피드백 나오고 술처먹다 팀원들한테 자료 제출 개늦게하고 자퇴마렵다
-
딱 한 마디만 하고 자러감 9 3
미쿠 ㅈㄴ 예뻐어~~~~~~~~~~~~
-
중앙대 가기 59일차 3 1
안녕하세요 중앙대29학번 부산사나이 이동현입니다 음 오늘이 벌써 59일차군요...
-
이제 좀 자보실까 11 1
음음
-
리젠존나느리네 1 0
오르비망함?
-
너무멍청해짐 1 0
ㅜㅜㅜㅜㅜ
-
생윤 진짜 1도 모르는 쌩노베인데 누구 듣는 게 좋을가여
-
15살과 엄마 그 사이는 2 0
뭐라함 급함
-
대신 연세대 가겠다 선언
-
작년 10모 20번 0 0
이렇게 푸는거 맞나..?
-
위키하우 도움 ㅈㄴ 안되네 6 0
ㅗㅗㅗㅗㅗㅗ
-
새르비 할수록 4 0
헛소리가 늘어가는듯
-
아니 난 신라면 쳐돌이라 5 0
신라면만 먹는데….
-
내가사실은생명과학을좋아함 1 0
수능말고 그냥생명과학
-
. 11 1
-
님들 최애 과목 말해보셈 7 0
난 국어
-
님들 최애 라면 말해보셈 10 0
난 신라면
-
라면이랑 과자 안먹은지 6일차 2 0
후후

저같이 파이썬 자바 깔짝거리는거랑 비교도 안되네요ㄷㄷ대단
자료구조라는 분야에서 가장 흔히 다뤄지는 단일 연결 리스트 예제예요 :) 선형 자료구조에 해당하지용.. 처음엔 막 복잡해보이지만 나중가면 그게 그거입니다. 익숙하지 않아서 어려워 보이는 거지, 뜯어보면 쉬워용..~
혹시 몇학년이세여
글구//=>#아닌가요??
파이썬은#쓰길래
C/C++ 주석은 // 이에용! 저는 2학년 입니다~_~