/*
将小写字母与汉字建立下下表所示的对应关系,则魔王说的话是:“天上一只鹅
地上一只鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅 "
----------------------------------------
t   d   s    a   e   z   g   x   n   h
天 地  上  一只 鹅  追  赶  下  蛋  恨
----------------------------------------
*/

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAXSIZE 100
#define FALSE 0
#define TRUE 1
typedef int status;
typedef char QElemType;

//---------单链队列----队列的链式存储结构-------
typedef struct QNode
{
        QElemType data;
        struct QNode *next;
}QNode,*QueuePtr;

struct LinkQueue
{
        QueuePtr front;    //队头指针
        QueuePtr rear;     //队尾指针
};          //-----队列----

LinkQueue Q;

status InitQueue(LinkQueue Q)
{
     Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
     if(!Q.front) _exit(FALSE);
     Q.front->next =Q.rear->next=NULL;
     return TRUE;

}


status QueueEmpty(LinkQueue Q)
{
       if(Q.front == Q.rear) return TRUE;
       return FALSE;
}

struct QNode * GetHead(LinkQueue Q)
{
       //定义一个指针,小心使用!
       QueuePtr p =NULL;
     if(Q.front ==Q.rear) return NULL;
     if(!QueueEmpty(Q))
     {
               p=Q.front;
               Q.front= p->next;

     }
     return p;
}
void MakeQueue(LinkQueue Q)
{
    char c = getchar();
    QueuePtr p=NULL;
    while(c != 10 && c != 32 )
    {
         p = (QueuePtr)malloc(sizeof(QNode)); //新建一个新数据,记得要动态分配内存
         if(p)
         {
               p->data = c;
                p->next =NULL;
               //Q.rear->next=p;
               printf("%d",Q.rear);
               Q.rear->next =p;            /*SIGSEGV:在POSIX兼容的平台上,SIGSEGV是当一个进程执行了一个无效的内存引用,
               或发生段错误时发送给它的信号。SIGSEGV的符号常量在头文件signal.h中定义。因为在不同平台上,信号
               数字可能变化,因此符号信号名被使用。通常,它是信号#11。*/
               Q.rear =p;

         }
         c = getchar();
         //if(Q->front == Q->rear) Q->rear =Q->front;
    }
}

void DelQueue(LinkQueue *Q)
{}

void QueueTraverse(LinkQueue Q)
{}

void PrintQueue(LinkQueue Q)
{

     QueuePtr p ;
            //******注意指针的使用
     p=Q.front;
     printf("%d",QueueEmpty(Q));
     while(!QueueEmpty(Q))
    {
         //p =GetHead(q);   //*******此时要传入的是指针
        // printf("%d\n",Q.front);
         if(Q.front){
                      p=Q.front;
                      Q.front=p->next;  //访问违例
         }
         switch(p->data)
         {
                  case 't':printf("天");break;
                  case 'd':printf("地");break;
                  case 's':printf("上");break;
                  case 'a':printf("一只");break;
                  case 'e':printf("鹅");break;
                  case 'z':printf("追");break;
                  case 'g':printf("赶");break;
                  case 'x':printf("下");break;
                  case 'n':printf("蛋");break;
                  case 'h':printf("恨");break;

         }
         if(Q.rear ==p) break;
         free(p);  // ***记得加这个
         p=NULL;
     }

}

int main()
{

    printf("初始化结果:%d\n",InitQueue(Q));
    MakeQueue(Q);
    PrintQueue(Q);
    system("PAUSE");
    return 0;
}