:se enc=utf8 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> const int NAME_SPACE = 20; int cnt = 0; typedef struct _node { char *name; struct _node *next; }linkedList; linkedList *tail = NULL; typedef struct { linkedList *head; }linkedList_h; linkedList_h *createListHead(); void addNode(linkedList_h *L); void deleteNode(linkedList_h *L); void freeLinkedList(linkedList_h *L); void printList(linkedList_h *L); linkedList_h *createListHead() { linkedList_h *r = NULL; // 새 헤드 생성 r=(linkedList_h*)malloc(sizeof(linkedList_h)); // 메모리 할당 r->head=NULL; return r; // 주소 반환 } void addNode(linkedList_h *L) { char str[NAME_SPACE] = {'\0'}; int idx = 0; printf("삽입할 노드의 데이터 입력 : "); scanf("%s",&str); printf("삽입할 위치 선택 : "); scanf("%d",&idx); ++cnt; linkedList *newNode = NULL; linkedList *p = L->head; newNode=(linkedList*)malloc(sizeof(linkedList)); newNode->name=(char*)malloc(sizeof(char)*NAME_SPACE); strcpy(newNode->name,str); newNode->next=NULL; if(L->head==NULL){ L->head=newNode; newNode->next=L->head; tail=newNode; return; } if(idx == 0){ newNode->next=p; L->head=newNode; return; } while(idx--){ p=p->next; } newNode->next=p->next; p->next=newNode; } void deleteNode(linkedList_h *L) { char str[NAME_SPACE] = {'\0'}; printf("삭제할 데이터 입력 :"); scanf("%s",&str); --cnt; linkedList *p = L->head; linkedList *pre = NULL; if(!strcmp(p->name, str)){ L->head=p->next; free(p); return; } while(p != NULL){ pre=p; p=p->next; if(!strcmp(p->name, str)){ pre->next=p->next; free(p); return; } } } void freeLinkedList(linkedList_h *L) { linkedList *p = NULL; while(cnt--){ p=L->head; L->head=L->head->next; free(p); p=NULL; } } void printList(linkedList_h *L) { int pcnt = 0; int tcnt = cnt; linkedList *p = L->head; printf("리스트 출력(%d) : ",cnt); while(p != NULL){ printf("(%d)%s ",pcnt++,p->name); p=p->next; if(!--tcnt){puts("");return;} } puts(""); } int main(void) { int slct = 0; linkedList_h *L = createListHead(); while(slct!=4) { puts("\n단순 원형 리스트 메뉴"); // 메뉴 puts("================="); puts("1. 노드 삽입"); puts("2. 노드 삭제"); puts("3. 리스트 출력"); puts("4. 프로그램 종료"); puts("================="); printf("메뉴 선택 : "); scanf("%d",&slct); switch(slct){ case 1: addNode(L); // 1. 노드 삽입 break; case 2: deleteNode(L); // 2. 노드 삭제 break; case 3: printList(L); // 3. 리스트 출력 break; case 4: break; // 4. 종료 default: puts("잘못된 명령입니다."); break; } } // freeLinkedList(L); // 링크드 리스트 L 해제 return 0; }