: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;
}