队列的初始化问题!
额,代码可能比较长,没有耐心看,我就先简单说下。主要是我输出的结果老是显示队列为空,也就是EnQueue()这个方法有问题,但是我找了好久也没有找出来。 大牛们帮帮小弟吧!~~~跪谢
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef int QElemType;
typedef struct QNode{//队列中 结点 的数据结构类型
QElemType date;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{//队列的数据结构类型
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//判断队列是否为空
bool Empty(LinkQueue &Q){
if( !Q.front && !Q.rear)
return true;
else
return false;
}
//初始化队列
int InitQueue(LinkQueue &Q){
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
exit(OVERFLOW);
Q.front ->next = NULL;
return OK;
}
//置队列为空
int DestoryQueue(LinkQueue &Q){
while(Q.front){
Q.rear = Q.front ->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
}
//在队列的尾端插入元素,分为两种情况。1队列为空。2队列非空
int EnQueue(LinkQueue &Q, int e){
if(Empty(Q) == false){//非空
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p){
printf("新结点内存分配失败!");
return ERROR;
}
p->date = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
else{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p){
printf("新结点内存分配失败!");
return ERROR;
}
p->date = e;
p->next = NULL;
Q.front = Q.rear;
}
return OK;
}
//删除队列队头的元素,并用e返回
int DeQueue(LinkQueue &Q, QElemType &e){
//如果队列为空
if(Q.front == Q.rear ){
printf("队列为空");
return ERROR;
}
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p){
printf("新结点内存分配失败");
return ERROR;
}
p = Q.front ->next;
e = p->date;
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;//当队列最后一个元素被删除的时候,尾指针也丢失,所以要重新给尾指针赋值
free(p);
//if(Q.front == NULL)
//Q.rear = NULL;
return OK;
}
int Front(LinkQueue &Q){
return Q.front ->date;
}
int main(){
int e;
LinkQueue Q;
InitQueue(Q);
if(Empty(Q) == true)//判断队列是否为空
printf("队列为空\n");
else
printf("队列不为空\n");
//向队列中插入0 ~ 9 10个数字
for(int i = 0 ; i < 10; i++){
EnQueue(Q, i);
}
for(int j = 0 ; j < 10; j++){
printf("%d\n", Front(Q));
if(!Empty(Q))
printf("队列为空\n");
else
printf("队列不为空\n");
DeQueue(Q, e);
}
DeQueue(Q, e);
for(i = 0 ;i < 10 ; i++){
EnQueue(Q, i);
}
DestoryQueue(Q);
if(Empty(Q) == true)
printf("队列为空\n");
else
printf("队列不为空\n");
return 0;
}
[解决办法]
#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW 0typedef int QElemType;typedef struct QNode //队列中 结点 的数据结构类型{ QElemType date; struct QNode *next;} QNode, *QueuePtr;typedef struct //队列的数据结构类型{ QueuePtr front; QueuePtr rear;} LinkQueue;//判断队列是否为空bool Empty(LinkQueue &Q){ if( !Q.front && !Q.rear) return true; else return false;}//初始化队列int InitQueue(LinkQueue &Q){ Q.front = Q.rear = 0; return OK;}//置队列为空int DestoryQueue(LinkQueue &Q){ while(Q.front) { Q.rear = Q.front ->next; free(Q.front); Q.front = Q.rear; } return OK;}//在队列的尾端插入元素,分为两种情况。1队列为空。2队列非空int EnQueue(LinkQueue &Q, int e){ if(Empty(Q) == false) //非空 { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if(!p) { printf("新结点内存分配失败!"); return ERROR; } p->date = e; p->next = NULL; Q.rear->next = p; Q.rear = p; } else { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if(!p) { printf("新结点内存分配失败!"); return ERROR; } p->date = e; p->next = NULL; Q.rear=p; Q.front = Q.rear; } return OK;}//删除队列队头的元素,并用e返回int DeQueue(LinkQueue &Q, QElemType &e){//如果队列为空 if(Empty(Q)) { printf("队列为空"); return ERROR; } QueuePtr p; p = Q.front; e = p->date; Q.front = p->next; if(Q.rear == p) Q.rear = Q.front=0; //当队列最后一个元素被删除的时候,尾指针也丢失,所以要重新给尾指针赋值 free(p); return OK;}int Front(LinkQueue &Q){ return Q.front ->date;}int main(){ int e; int i; LinkQueue Q; InitQueue(Q); if(Empty(Q) == true) //判断队列是否为空 printf("队列为空\n"); else printf("队列不为空\n");//向队列中插入0 ~ 9 10个数字 for(i = 0 ; i < 10; i++) { EnQueue(Q, i); } for(int j = 0 ; j < 10; j++) { printf("%d\n", Front(Q)); if(Empty(Q)) printf("队列为空\n"); else printf("队列不为空\n"); DeQueue(Q, e); } DeQueue(Q, e); for(i = 0 ; i < 10 ; i++) { EnQueue(Q, i); } DestoryQueue(Q); if(Empty(Q) == true) printf("队列为空\n"); else printf("队列不为空\n"); return 0;}