/* 단순 ì—°ê²° 리스트 리스트 í—¤ë” ì¡´ìž¬ 노드 ëê°’ = NULL 노드 í…Œì¼ í¬ì¸í„° ì—†ìŒ ë…¸ë“œ DATA = CHAR* <- NAME_SPACE í¬ê¸° ë™ì í• ë‹¹ */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #define NAME_SPACE 20 int cnt=0; typedef struct _node{ char *name; struct _node *next; }linkedList; typedef struct { linkedList *head; }linkedList_h; linkedList_h *createListHead(void); void addLast(linkedList_h *L, char *str); void addMidd(linkedList_h *L, char *str); void searchList(linkedList_h *L); void deleteNode(linkedList_h *L); void printList(linkedList_h *L); void freeLinkedList(linkedList_h *L) linkedList_h *createListHead() { linkedList_h *r; // 새 헤드 ìƒì„± r=(linkedList_h*)malloc(sizeof(linkedList_h)); // 메모리 í• ë‹¹ r->head=NULL; // 초기화 return r; // 주소값 반환 } void addSlct(linkedList_h *L){ char str[NAME_SPACE]; char slct[5]; printf("ì‚½ìž…í• ë…¸ë“œì˜ ë°ì´í„° ìž…ë ¥ : "); scanf("%s",&str); for(;;){ printf("ì‚½ìž…í• ìœ„ì¹˜ ì„ íƒ : "); scanf("%s",&slct); if(!strcmp(slct,"No")){addLast(L, str);return;} // 위치 ì„ íƒ No ë©´ 마지막 ë…¸ë“œì— ì¶”ê°€ else if(!strcmp(slct,"Yes")){ // 위치 ì„ íƒ Yes ë©´ ì¸ë±ìŠ¤ê°’ì„ ë°›ê³ ê·¸ ìœ„ì¹˜ì— ì¶”ê°€ addMidd(L, str); return; } else puts("ìž˜ëª»ëœ ê°’ ìž…ë ¥. (Yes or No)"); } } void addLast(linkedList_h *L, char *str) { linkedList *newNode; linkedList *p; newNode=(linkedList*)malloc(sizeof(linkedList)); newNode->name=(char*)malloc(sizeof(char)*NAME_SPACE); strcpy(newNode->name,str); newNode->next=NULL; cnt++; if(L->head==NULL){ L->head=newNode; printList(L); // 리스트 ì¶œë ¥ return; } p=L->head; while(p->next != NULL){ p=p->next; } p->next=newNode; printList(L); // 리스트 ì¶œë ¥ } void addMidd(linkedList_h *L, char *str) { linkedList *newNode; linkedList *p; newNode=(linkedList*)malloc(sizeof(linkedList)); newNode->name=(char*)malloc(sizeof(char)*NAME_SPACE); strcpy(newNode->name,str); newNode->next=NULL; p=L->head; if(L->head==NULL){ puts("í—¤ë“œë°–ì— ì—†ìŠµë‹ˆë‹¤."); L->head=newNode; cnt++; printList(L); // 리스트 ì¶œë ¥ return; } char target[NAME_SPACE]; printList(L); // 리스트 ì¶œë ¥ printf("ì‚½ìž…í• ë°ì´í„° ìž…ë ¥ : "); scanf("%s",&target); while(strcmp(p->name,target)){ p=p->next; if(p == NULL){ puts("ë°ì´í„°ê°€ 존재하지 않습니다."); return; } } newNode->next=p->next; p->next=newNode; cnt++; printList(L); // 리스트 ì¶œë ¥ } void searchList(linkedList_h *L) { int i=0, n=0; int *idx; char str[NAME_SPACE]; idx=(int*)malloc(sizeof(int)*cnt); printf("ê²€ìƒ‰í• ë°ì´í„° ìž…ë ¥ : "); scanf("%s",&str); linkedList *p; p=L->head; while(p != NULL){ *(idx+i)=0; if(!strcmp(p->name, str)){ n++; *(idx+i)=i+1; } p=p->next; i++; } if(n==0) puts("ë™ì¼í•œ ë°ì´í„°ë¥¼ 가진 노드가 존재하지 ì•ŠìŒ"); else{ printf("%dê°œì˜ ë…¸ë“œ 중 %dê°œì˜ ë…¸ë“œ ë°ì´í„°ì™€ ì¼ì¹˜\n", cnt, n); for(i=0; i<cnt; i++){ if(*(idx+i)){ if(n==1) printf("%d ", *(idx+i)); else{ printf("%d, ", *(idx+i)); n--; } } } printf("번째 ë°ì´í„°\n"); } } void deleteNode(linkedList_h *L) { linkedList *p; linkedList *t; linkedList *pre; p=L->head; t=L->head; if(p==NULL){ puts("노드가 존재하지 않습니다."); return; } char str[NAME_SPACE]; printf("ì‚ì œí• ë°ì´í„° ìž…ë ¥ : "); scanf("%s",&str); if(!strcmp(p->name, str)){ L->head=p->next; free(p); cnt--; return; } while(p != NULL){ if(!strcmp(p->name, str)){ pre->next=p->next; free(p); cnt--; return; } pre=p; p=p->next; } puts("ë°ì´í„°ê°€ 존재하지 않습니다."); } void printList(linkedList_h *L) { linkedList *p; p=L->head; /* 리스트 ì¹´ìš´í„° linkedList *pcnt; pcnt=L->head; int cnt=0; while(pcnt != NULL){ ++cnt; pcnt=pcnt->next; } */ printf("리스트 ì¶œë ¥(%d) : ",cnt); while(p != NULL){ if(p->next==NULL) printf("%s",p->name); else printf("%s->",p->name); p=p->next; } puts(""); } void freeLinkedList(linkedList_h *L) { linkedList *p; while(L->head != NULL){ p=L->head; L->head=L->head->next; free(p); p=NULL; } } int main(void){ int slct; linkedList_h *L; L=createListHead(); while(slct!=5) { puts("\n단순 ì—°ê²° 리스트 메뉴"); // 메뉴 puts("================="); puts("1. 노드 삽입"); puts("2. 노드 ì‚ì œ"); puts("3. 노드 검색"); puts("4. 노드 ì¶œë ¥"); puts("5. 프로그램 종료"); puts("================="); printf("메뉴 ì„ íƒ : "); scanf("%d",&slct); switch(slct){ case 1: addSlct(L); // 1. 노드 삽입 break; case 2: deleteNode(L); // 2. 노드 ì‚ì œ break; case 3: searchList(L); // 3. 노드 검색 break; case 4: printList(L); // 4. 노드 ì¶œë ¥ break; case 5: break; // 5. 프로그램 종료 default: printf("ìž˜ëª»ëœ ëª…ë ¹ìž…ë‹ˆë‹¤.\n"); break; } } freeLinkedList(L); // ë§í¬ë“œ 리스트 L í•´ì œ return 0; }