/*
将小写字母与汉字建立下下表所示的对应关系,则魔王说的话是:“天上一只鹅
地上一只鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅 "
----------------------------------------
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;
}