자료구조를 다시 공부할 겸 해서 이중연결리스트로 간단한 전화번호부를 만들어 보았다.
대충 만든거라 예상치 못한 에러가 있을 수 있음..
그래도 나름 웬만한 에러는 다 잡았다고 생각함
또한 내가 보려고 올리는거라 설명이 좀 부족할 수 있음
전체 코드는 마지막에 한꺼번에 올리도록 하겠음
1. 연결리스트를 위한 구조체 생성하기
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;- 리스트에 들어갈 각 노드를 위한 구조체에는 이중연결리스트를 사용할 것이므로 앞 노드와 뒤 노드의 주소를 저장하는 변수를 생성함.
- 전화번호부에 들어갈 사용자 번호와 이름, 전화번호용 변수를 생성함. 근데 코딩하다보니 딱히 사용자 번호를 쓸 일이 없어서 안씀..
- 리스트용 구조체에는 리스트의 헤드와 테일을 저장하는 변수, 리스트의 총 갯수를 파악하기위한 cnt변수를 생성함.
2. 프로그램에서 사용할 함수 정의
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); // 리스트 출력
- 프로그램에 사용되는 함수를 미리 정의. 각 내용들은 아래에 설명하겠음.
- LastNode함수는 단일연결리스트 테스트할때 쓰던 코드를 좀 가져오느라 같이 딸려옴..
3. 각 함수별 설명
[ printMain / returnMain / inputMenu / inputData ]
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);
}
- 별 거 없다. 간단한 메뉴를 위한 출력문과 데이터 입력을 받는 함수들이다.
- returnMain()에서 scanf()관련 주석을 설명하자면, scanf함수를 한번 이상 사용하게 되면, 입력 할 때 쓰는 엔터값이 버퍼에 저장되게 된다.
scanf함수는 stdin이라는 버퍼에 있는 값을 읽는데, 이 버퍼에 엔터키 값이 들어가는 것.
따라서 두번째 scanf함수 부터는 버퍼에 있는 엔터키 값이 자동으로 입력되어 그저 슥 지나가게 된다. (인식을 못 하는 것 처럼 보임)
해결방법으로 fflush(stdin)을 쓰는 방법이 있다. 말 그대로 stdin 버퍼에 있는 값을 다 날려버린다.
두번째로 scanf(" %c", c) 와 같이 한칸을 띄고 입력을 받는 방법인데, 한 칸을 띄우게 되면 버퍼의 첫번째 값을 무시하고 두번째 값부터 읽게 되어 엔터값을 무시할 수 있다.
다음 글부터 주요 함수들을 설명하겠음
'개발 > C' 카테고리의 다른 글
| [C]이중연결리스트를 사용한 전화번호부 - 03 (0) | 2018.03.30 |
|---|---|
| [C]이중연결리스트를 사용한 전화번호부 - 02 (0) | 2018.03.30 |