오찌는 도찌입니까?
2024. 8. 2. 14:53
오찌도찌
2023. 4. 20. 15:43
오찌기 도찌기 옷도로 돗돗찌
'일기장' 카테고리의 다른 글
| 오찌는 도찌입니까? (1) | 2024.08.02 |
|---|
[C]이중연결리스트를 사용한 전화번호부 - 03
2018. 3. 30. 14:54
3. 이어서 함수 설명
[ findNode / printNode ]
void findNode(linkedList *L){
node *f = L->head;
int i, num;
printf("찾을 노드 번호를 입력하세요 : ");
scanf(" %d", &num);
if (L->cnt <= 0) {
printf("리스트가 비었음.\n");
returnMain(L);
}
else if (num > L->cnt) {
printf("검색 위치가 리스트의 길이보다 김.\n");
returnMain(L);
}
else {
for (i = 1; i < num; i++)
f = f->next;
printf("%d 번째 노드의 값 - 이름 : %s 전화번호 : %d\n", num, f->name, f->phone);
returnMain(L);
}
}
void printNode(linkedList *L){
node *f = L->head;
printf("리스트\n");
while (f != NULL) {
printf("이름 : %s 전화번호 : %d\n", f->name, f->phone);
f = f->next;
}
printf("\n노드 수 : %d\n", L->cnt);
returnMain(L);
}
- findNode에서도 삽입과 삭제할 때의 경우와 같이 원하는 위치로 찾아가야 한다.
더미노드 f 를 만들고 반복문으로 찾아간 후, 그 값을 출력한다.
- printNode에서는 모든 노드를 한번씩 찾아가서 값을 출력해야 하기 때문에, 리스트의 테일까지 찾아간다.
테일까지 찾아가면서 노드의 값들을 출력한다.
4. 전체 소스 코드
/* Phone Book (use Doubly Linked List) Coder : GGaShu LSW Date : 2018.03.30 Purpose : 이중연결리스트의 활용 */ #include#include #include 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; 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); // 리스트 출력 void main() { linkedList *L = (linkedList *)malloc(sizeof(linkedList)); Init(L); printMain(L); } 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); } void Init(linkedList *L) { L->head = NULL; L->tail = NULL; L->cnt = 0; } void createNode(linkedList *L, char *ndata, int pdata, int num) { node *f = L->head; node *newNode = (node *)malloc(sizeof(node)); newNode->no = num; strcpy(newNode->name, ndata); newNode->phone = pdata; int i; if (num <= 0) { printf("삽입 위치가 리스트의 길이보다 짧음.\n"); exit(1); } else if (num == 1) { if (L->head == NULL && L->tail == NULL) { printf("헤드\n"); L->head = newNode; L->tail = newNode; newNode->next = NULL; printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone); L->cnt++; returnMain(L); } else { printf("헤드뺏기2\n"); newNode->next = L->head; L->head = newNode; L->head->next->prev = newNode; newNode->prev = L->head; printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone); L->cnt++; returnMain(L); } } else if (num == (L->cnt) + 1) { printf("테일\n"); newNode->prev = L->tail; L->tail->next = newNode; L->tail = newNode; newNode->next = NULL; printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone); L->cnt++; returnMain(L); } else { if (num > (L->cnt) + 2) { printf("삽입 위치가 리스트의 길이보다 길다\n"); exit(1); } else { for (i = 1; i < num - 1; i++) f = f->next; } newNode->next = f->next; f->next->prev = newNode; newNode->prev = f; f->next = newNode; printf("이름 : %s 전화번호 : %d\n", newNode->name, newNode->phone); L->cnt++; returnMain(L); } } void createLastNode(linkedList *L, char *ndata, int pdata){ // 일단 사용 안함 } void deleteNode(linkedList *L){ node *f = L->head; int i, num; printf("삭제할 노드 번호를 입력하세요 : "); scanf(" %d", &num); if (num <= 0) { printf("삭제 위치가 리스트의 길이보다 짧다\n"); deleteNode(L); } else if (num == 1) { L->head = L->head->next; printf("%d 번째 노드 삭제 완료\n", num); L->cnt--; returnMain(L); } else if (num == L->cnt) { L->tail = L->tail->prev; L->tail->next = NULL; printf("%d 번째 노드 삭제 완료\n", num); L->cnt--; returnMain(L); } else { if (num > (L->cnt) + 1) { printf("삭제 위치가 리스트의 길이보다 길다\n"); deleteNode(L); } else { for (i = 1; i < num; i++) f = f->next; } f->prev->next = f->next; f->next->prev = f->prev; printf("%d 번째 노드 삭제 완료\n", num); L->cnt--; returnMain(L); } } void deleteLastNode(linkedList *L){ // 일단 사용 안함. } void findNode(linkedList *L){ node *f = L->head; int i, num; printf("찾을 노드 번호를 입력하세요 : "); scanf(" %d", &num); if (L->cnt <= 0) { printf("리스트가 비었음.\n"); returnMain(L); } else if (num > L->cnt) { printf("검색 위치가 리스트의 길이보다 김.\n"); returnMain(L); } else { for (i = 1; i < num; i++) f = f->next; printf("%d 번째 노드의 값 - 이름 : %s 전화번호 : %d\n", num, f->name, f->phone); returnMain(L); } } void printNode(linkedList *L){ node *f = L->head; printf("리스트\n"); while (f != NULL) { printf("이름 : %s 전화번호 : %d\n", f->name, f->phone); f = f->next; } printf("\n노드 수 : %d\n", L->cnt); returnMain(L); }
5. 마치며
블로그에 글을 정말 오랬만에 쓴다.
자료구조나 다시 공부해볼 겸 프로그램을 짜고 나서, 갑자기 블로그가 있다는 사실이 생각나 올리게 되었다.
나도 아직 프로그래밍에 미숙하여 많이 공부중이지만 이 포스트가 다른 사람들에게 도움이 되었으면 좋겠다.
끝!
이 아니라 포스팅을 언제 또 다시 할지는 미정...
진짜 끝!
'개발 > C' 카테고리의 다른 글
| [C]이중연결리스트를 사용한 전화번호부 - 02 (0) | 2018.03.30 |
|---|---|
| [C]이중연결리스트를 사용한 전화번호부 - 01 (0) | 2018.03.30 |