// 비주얼 스튜디오 2010으로 코딩했고.
//책에나온대로 배껴서 코딩했는데
//가장처음 함수의 선언에서 함수이름에 빨간줄.
//오류출력창에는 쓸데없이 제자리 있는{,{,* 같은거 잡고 늘어지네;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct listNode{
 char data[10];
 struct ListNode *link;
}
typedef struct {
 ListNode * head;
}linkedList_h;


linkedList_h* createLinkedList_h(void);
void freeLinkedList_h(linkedList_h*);
void addLastNode(linkedList_h*,char*);                      //반환형 다음에 나오는 함수이름들이 오류줄..
void reserve(linkedList_h*);                                        // 머가 잘못된거지..
void deleteLastNode(linkedList_h*);
void printList(linkedList_h*);

linkedList_hz createLinkedList_h(void){
 linkedList_h* L;
 L=(linkedList_h*) malloc (sizeof(linkedList_h));
 L->head->NULL;
 return L;
}

void addLastNode (linkedList_h* L,char* x){
 listNode* newNode;
 listNode* p;
 newNode= (listNode*) malloc (sizeof(listNode));
 strcpy(newNode->data,x);
 newNode->link=NULL;
 if(L->head == NULL)
  L->head = newNode;
 return;
}

void reverse(linkedList_h * L){
 listNode* p;
 listNode* q;
 listNode* r;

 p=L->head;
 q=NULL;
 r=NULL;

 while(p!=NULL){
  r=q;
  q=p;
  p=p->link;
  q->link =r;
 }
 L->head=q;
}

void deleteLastNode(linkedList_h L){
 listNode * previous;
 listNode * current;
 if(L->head==NULL) return;
 if(L->head->link == NULL){
  free(L->head);
  L->head = NULL;
  return;
 }
 else{
  previous = L->head;
  current = L->head->link;
  while(current ->link !=NULL){
   previous = current;
   current = current->NULL;
  }
  free(current);
  previous->link=NULL;
 }
}

void freeLinkedList_h(linkedList_h* L){
 listNode* P;
 while(L->head != NULL){
  p=L->head;
  L->head = L->head->link;
  free(p);
  p=NULL;
 }
}

void printList(linkedList_h* L){
 listNode * p;
 printf(\"L = (\");
 p=L->head;
 while(p !=NULL){
  printf(\"%s\",p->data);
  p=p->link;
  if(p !=NULL){
   printf(\",\");
  }
 }
 printf(\")\\n\");

}
int main(){
 linkedList_h * L;
 L=createdLinkedList_h();
 printf(\"공백 리스트 생성하기! \\n\");
 addLastNode(L,\"월\");
 addLastNode(L,\"수\");
 addLastNode(L,\"금\");
 printList(L); getchar();

 printf(\"(3) 리스트 마지막에 노드 한개 추가하기! \\n\");
 addLastNode(L,\"일\");
 printList(L); getchar();
 
 printf(\"(4) 마지막 노드 삭제하기! \\n\");
 deleteLastNode(L);
 printList(L); getchar();

 
 printf(\"(5) 리스트의 원소를 역순으로 변환하기! \\n\");
 reverse(L);
 printList(L); getchar();

 
 printf(\"(6) 리스트 공간을 해제하여, 공백 리스트 상태로 만들기! \\n\");
 freeLinkedList_h(L);
 printList(L);

 getchar();
 return 0;
}