컴공 일기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 1
3모 대비로 수학 풀거 ㅊㅊ좀 2503은 이미 풂
-
고생했더니 치킨마렵노 14 0
이걸먹어말어
-
끝나고 직접 프린트해서 푸는 방법밖에 없는 건가요? 아님 어떻게... 신청해서 보는...
-
배부른데 치킨시킴 13 0
ㅁㅌㅊ?
-
몬스터 신상 먹엇음 14 3
처음에는 아무맛도 안 나는 줄 알앗는데 계속 먹어보니까 맛이 나긴 함 토레타맛 나 흠…
-
이걸해야먹고살수가있는게 고2 고1은 이게 통합과학 시대라
-
언매 고수님들 불쌍한 재수생 한번만 구제해주세요 ㅠㅠㅠㅠ 1 0
요약: 3월부터 잇올에서 공부 시작한 국어 쓰레기같이 못하는 재수생이 지방대...
-
그게 나야 바 둠바 두비두밥~ ^^
-
웃참 하느라 너무 힘듦 작년거보다 올해거가 특히 더 웃김
-
집보내줘 2 0
집
-
근데 4 1
귀납 공부좀 해야할듯 공부하면 늘겠지?? ㅠㅠ 시간 넘 오래걸림
-
그냥 문제를 0 1
잘못 읽었던 거였음...;;
-
등급컷 나올 때 볼걸 0 0
궁금해버림 ㅋㅋㅋㅋ
-
걍 20,22는 시간 자체가 안남았는데 이거 실전개념 다시 들어야 할까요 뉴런 들었어요
-
세상을 정화하는 키리코 출격 0 0
불쌍한중생들을위해경쟁전은하지않는다
-
그것부터 애매하고 윤사도 어려운건지 걍 내가 개못본건지 모르겠네
-
대해린인가 그분 요즘 뭐하시나 3 0
내 최애인데
-
쌍지 벼락치기 5 0
이개다 80퍼정도 들엇는데 걍 이만복만 ㅈㄴ봐도 3모 2-3정도는 확보 가능할까요??
-
스블 카나토미 질문 3 0
고3현역임요 고2모고는 1컷걸리고 고3꺼풀면 14,15,21,22 틀려요 카나토미...
-
밥먹고 바로 누우면 소된다 5 1
음메~~
-
3월 더프 5 0
미적 57분 100점! 15번까지 12분걸리고 22번 좀 어렵고 수열의 극한 개빡
-
반수생 커리 추천해주세요 0 0
서성한 공대 23학번 재학중이고 작년에 무휴학으로 공부하고 수능쳐서 화작 기하 생명...
-
3덮 - 44/47 틀린 문항 - 17 19/18 화2는 아직 진입한지 보름밖에...
-
세계사 수특 1 1
왤케 어려운거 같지 동사 수특보다 더 어려운데
-
뭔가뭔가 10 1
얘는 진짜 슬픈것같음 얘도 슬픈것같긴한데 마음이 아파ㅠㅠ 이런느낌이면 오리비는...
-
나 지금 영어가 ㅈㄴ 무서움 16 0
영어를 거의 1년 넘게 안했는데 개 조지는 거 아님? ㅋㅋㅋㅋㅋ
-
대대장 한명 바뀌었다고 5 1
어떻게 이렇게 삶의 질이 안 좋아지냐..
-
상상 모고 등급컷 0 0
확인 어케함
-
ㅎㅇ 2 0
학교 생활 개재밌어서 잘 안들어오네 ㅃㅇ
-
3월 사설 왜 이리 어려워요… 2 0
21 22 구경도 못해보고 미적 아예 손도 못 댔는데 시간 다지남ㅠ
-
물화생 전부 내신 1등급인데 저 셋 다 수능때 안봄& 지구과학은 내신에서도 안듣고서...
-
'재'입대 2번이니까 총 군대 3번 가는거고 몰론 월급은 다 줌 군대 전역하면...
-
대학 로망 특) 0 1
막상 와보니 별거아님 진짜
-
08들 다 뒷공부하러갔냐 0 1
-
교수님들 발음 뭔가뭔가임 2 2
난 셰익스피어를 xx피어라고 발음 안 하는 교수님을 본 적이 없어
-
수고했어 오늘도 14 1
아무도 너의 슬픔에 관심없대도 난 늘 응원해 수고했어 오늘도
-
어제 내 면역이 무너졌어 0 0
어제부터 구내염나더라 어쩌구 엉엉 내 성적을 가져가도 좋(지 않)아 제발 꺼져줘
-
왜 공부내용은 잘 기억에 안남는데 단 한순간의 감정적 기억은 뇌에 새겨지는가.. 왜...
-
분명 팔로워 150명대였는데 3 1
30명정도가 탈릅했네
-
윤사 개망했는데 윤사 보신분 6 0
35점 인데 ㅋㅋㅋㅋ 어려웠나?
-
수능판은 빨리 떠나는게 답임 0 4
단점은 이러니까 과외를하기가 이게 싹다까먹음 아 과외구해야하는데
-
서포터즈 해보고싶당 0 0
그런거심
-
아 너무 심심하네 4 0
팔러워 뭐하니
-
대학들어가고여기오니까 뭐 할게없노 11 28
-
조연이라도 되고 싶은 것은 욕심일까요,,
-
실험과목이 시작됬다 1 0
또 눈 안 마주치고 말하는거 연습해야겠다...
-
어어 저격하지 마라 1 0
ㅅㅂ
-
야식추천 1 0
받겠습니다
-
오르비 새로운 성대 빌런 입갤 (다큐)ㅋㅋㅋ 21 26
우리 3C 273이는요 고대를 가고 싶었어요 근데 어림도 없지 성적이 부족해서...
-
아거 나만그런가 5 0
가끔 리트 풀면 보기문제보다 그 앞에 게 더 어려운거가틈

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