C언어 구조체 이름순 정렬 - ceon-eo gujoche ileumsun jeonglyeol

이중연결리스트를 이용해서 전화부를 만들고 있는데 삽입, 삭제, 검색을 모두 만들긴 했지만 삽입할때 이름순으로 삽입을 어떻게 해야 할지 잘 모르겠습니다. strcmp로 비교 해서 0보다 클때 앞뒤를 바꿔줘야 하는것은 알겠지만 이중연결리스트에서 구현을 하려니 어렵네요.. dinsert 함수 부분 이름순으로 삽입할 수 있게 도와주시면 감사하겠습니다.

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //strcmp 및 strcpy_s 라이버러리 함수 사용하기 위해서   typedef struct PhoneBook { // PhoneBook 타입 char name[10]; char phone[20]; } PhoneBook;   typedef struct DListNode { // 이중연결 노드 타입 PhoneBook data; struct DListNode* llink; //선행노드 struct DListNode* rlink; // 후속노드 } DListNode;   // 이중 연결 리스트를 초기화 void init(DListNode* phead) { phead->llink = phead; phead->rlink = phead; }   // 이중 연결 리스트의 노드를 출력 : 이름과 전화번호 출력 void dprint(DListNode* phead) { DListNode* p; for (p = phead->rlink; p != phead; p = p->rlink) printf("이름 : %s, 전화번호 : %s\n", p->data.name, p->data.phone); }   // 새로운 노드 이름순으로 정렬된 위치에 삽입 void dinsert(DListNode* phead, PhoneBook in) { DListNode* newnode = (DListNode*)malloc(sizeof(DListNode)); DListNode* p; p = phead->rlink; newnode->data = in; newnode->llink = p; newnode->rlink = p->rlink; p->rlink->llink = newnode; p->rlink = newnode; }   // 주어진 이름을 갖는 노드 삭제 void ddelete(DListNode* phead, char* name) { DListNode* p; for (p = phead->rlink; p != phead; p = p->rlink) { if (strcmp(p->data.name, name) == 0) { p->llink->rlink = p->rlink; p->rlink->llink = p->llink; free(p); printf("%s이(가) 리스트에서 삭제되었습니다\n", name); return; } } if (strcmp(p->data.name, name) != 0) printf("%s이(가) 리스트에 존재하지 않습니다\n", name); }   // 주어진 이름을 찾아 이름과 전화번호를 출력 void dsearch(DListNode* phead, char* name) { DListNode* p; for (p = phead->rlink; p != phead; p = p->rlink) { if (strcmp(p->data.name, name) == 0) { printf("이름 : %s, 전화번호 : %s\n", p->data.name, p->data.phone); return; } } if (strcmp(p->data.name, name) != 0) printf("%s이(가) 리스트에 존재하지 않습니다\n", name); }   int main(void) { int menu; // 메뉴 선택 char name[10]; // 삭제, 검색시 입력받을 이름 PhoneBook in; // 삽입시 입력받을 연락처 DListNode* head = (DListNode*)malloc(sizeof(DListNode)); // 헤드노드 생성 init(head); // 헤드노드 초기화   for (;;) { printf("메뉴를 선택하시오.\n"); printf("1. 삽입 2. 삭제, 3, 검색, 4. 출력, 5. 종료 : "); scanf_s("%d", &menu); switch (menu) { case 1: // 삽입 printf("이름을 입력하시오: "); scanf_s("%s", in.name, sizeof(in.name)); printf("전화번호를 입력하시오: "); scanf_s("%s", in.phone, sizeof(in.phone)); dinsert(head, in); break; case 2: // 삭제 printf("이름을 입력하시오: "); scanf_s("%s", name, sizeof(name)); ddelete(head, name); break; case 3: // 검색 printf("이름을 입력하시오: "); scanf_s("%s", name, sizeof(name)); dsearch(head, name); break; case 4: // 출력 dprint(head); break; default: // 종료 exit(0); } } return 0; }

Toplist

최신 우편물

태그