求助:队列的输出问题
程序在devc++中运行,当输入两个数据后以0 0结束,但在输出过程中总会弹出.exe出现问题对话框 不知如何修改???
#include <stdio.h>
#include <string.h>
#define QUEUEMAX 15
typedef struct
{
char key[QUEUEMAX];
char name[20];
}DATA;
typedef struct
{
DATA data[QUEUEMAX]; //队列数组
int head; //队头
int tail; //队尾
}SeqQueue;
SeqQueue *SeqQueueInit()
{
SeqQueue *q;
if(q=(SeqQueue *)malloc(sizeof(SeqQueue))) //申请保存队列的内存
{
q->head = 0;//设置队头
q->tail = 0;//设置队尾
return q;
}else
return NULL; //返回空
}
int SeqQueueIn(SeqQueue *q,DATA data)//顺序队列的入队函数
{
if(q->tail==QUEUEMAX)
{
printf("队列已满!\n");
return(0);
}else{
q->data[q->tail++]=data;
return(1);
}
}
DATA *SeqQueueOut(SeqQueue *q)//顺序队列的出队
{
if(q->head==q->tail)
{
printf("\n队列已空!\n");
return NULL;
}else{
return &(q->data[q->head++]);
}
}
DATA *SeqQueuePeek(SeqQueue *q) //获取队头元素
{
if(SeqQueueIsEmpty(q))
{
printf("\n队列为空!\n");
return NULL;
}else{
return &(q->data[q->head]);
}
}
main()
{SeqQueue *q;
DATA data,*data1; //注意定义变量、赋值要一一对应
char key[15],name[20];
printf("输入关键字、姓名:\n");
q=SeqQueueInit();
do{
scanf("%s",data.key);
if(strcmp(data.key,"0")==0) break;
scanf("%s",data.name);
SeqQueueIn(q,data);
}while(1);
data1=SeqQueueOut(q);
printf("%s\n",data1->name);
data1=SeqQueueOut(q);
printf("%s\n",data1->name);
data1=SeqQueueOut(q);
printf("%s\n",data1->name);
getch();}
[解决办法]
问题在你使用data1=SeqQueueOut(q);的时候如果为空了你的返回值是Null了,也就是 data1已经是null了你再调用 printf("%s\n",data1->name);输出的时候就肯定是异常了啊!
你改成if (NULL!=data1)
{
printf("%s\n",data1->name);
}
[解决办法]
#include <stdio.h>#include <string.h>#include <malloc.h>#define QUEUEMAX 15typedef struct{ char key[QUEUEMAX]; char name[20]; }DATA;typedef struct{ DATA data[QUEUEMAX]; //队列数组 int head; //队头 int tail; //队尾 }SeqQueue;SeqQueue *SeqQueueInit(){ SeqQueue *q; if(q=(SeqQueue *)malloc(sizeof(SeqQueue))) //申请保存队列的内存 { q->head = 0;//设置队头 q->tail = 0;//设置队尾 return q; } else return NULL; //返回空 }int SeqQueueIn(SeqQueue *q,DATA data)//顺序队列的入队函数{ if(q->tail==QUEUEMAX) { printf("队列已满!\n"); return(0); }else{ q->data[q->tail++]=data; return(1); }}DATA *SeqQueueOut(SeqQueue *q)//顺序队列的出队{ if(q->head==q->tail) { printf("\n队列已空!\n"); return NULL; }else{ return &(q->data[q->head++]); }}/*DATA *SeqQueuePeek(SeqQueue *q) //获取队头元素{ if(SeqQueueIsEmpty(q)) { printf("\n队列为空!\n"); return NULL; }else{ return &(q->data[q->head]); }} */void main(){ SeqQueue *q; DATA data,*data1; //注意定义变量、赋值要一一对应 //char key[15],name[20]; int i; printf("输入关键字、姓名:\n"); q=SeqQueueInit(); do{ scanf("%s",data.key); if(strcmp(data.key,"0")==0) break; scanf("%s",data.name); SeqQueueIn(q,data); }while(1); for (i = 0; i < 3; i++) { if((data1=SeqQueueOut(q)) != NULL)/* 输出前判断指针是不是空 */ printf("%s\n",data1->name); } getchar();}