#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define NAME_SPACE 5

typedef struct _node{
        char *name;
        struct _node *next;
}linkedList;

typedef struct {
        linkedList *head;
}linkedList_h;

linkedList_h *createListHead()
{
        linkedList_h *r;
        r=(linkedList_h*)malloc(sizeof(linkedList_h)); // ë©~T모리 í~U| ë~K¹
        r->head=NULL; // ì´~H기í~Y~T
        return r;
}


void addLast(linkedList_h *L, char *str)
{
        linkedList *newNode; // ì~C~Hë~E¸ë~S~\ ì~C~]ì~D±
        linkedList *p;
        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;
                return;
        }
        p=L->head;
        while(p->next != NULL){
                p=p->next;
        }
        p->next=newNode;
}

void reverseList(linkedList_h *L)
{
        linkedList *p;
        linkedList *q;
        linkedList *r;
        p=L->head;
        q=NULL;
        r=NULL;
        while(p != NULL){
                r=q;
                q=p;
                p=p->next;
                q->next=r;
        }
        L->head=q;
}

void deleteNode(linkedList_h *L, char *str)
{
        linkedList *p;
        linkedList *pre;
        p=L->head;

        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;
        while(L->head != NULL){
                p=L->head;
                L->head=L->head->next;
                free(p);
                p=NULL;
        }
}

void printList(linkedList_h *L)
{
        linkedList *p;
        p=L->head;
        printf("( ");
        while(p != NULL){
                printf("%s ",p->name);
                p=p->next;
        }
        printf(")\n");
}

int main(void){
        linkedList_h *L;
        L=createListHead();

        addLast(L, "Kim"); // ì~C~H ë~E¸ë~S~\ ì~B½ì~^~E
        addLast(L, "Lee"); // ì~C~H ë~E¸ë~S~\ ì~B½ì~^~E
        addLast(L, "Park"); // ì~C~H ë~E¸ë~S~\ ì~B½ì~^~E
        printList(L); // ì¶~\ë| ¥
        addLast(L, "Yoo"); // ì~C~H ë~E¸ë~S~\ ì~B½ì~^~E
        printList(L); // ì¶~\ë| ¥
        deleteNode(L, "Park"); // í~J¹ì| ~U ê°~R ë~E¸ë~S~\ ì~B­ì| ~\
        printList(L); // ì¶~\ë| ¥
        reverseList(L); // 리ë²~Dì~J¤
        printList(L); // ì¶~\ë| ¥

        freeLinkedList(L); // ë§~Aí~A¬ë~S~\ 리ì~J¤í~J¸ L í~U´ì| ~\

        printList(L);

        return 0;
}