首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

队列的输出有关问题

2012-03-23 
求助:队列的输出问题程序在devc++中运行,当输入两个数据后以0 0结束,但在输出过程中总会弹出.exe出现问题

求助:队列的输出问题
程序在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);
}
[解决办法]

C/C++ code
#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();} 

热点排行
Bad Request.