队列结构给出奇怪的错误

时间:2011-11-15 10:04:16

标签: c++ data-structures queue

这里是队列实现,这给了我非常不清楚的错误

#include<iostream>
#include "bool.h"
#include "item.h"
#include "queue.h"

using namespace std;

void init_queue(queue *q){
    q->first=0;
    q->last=queuesize-1;
    q->count=0;

}
       void enqueue (queue *q,item_type x){
           if(q->count>=queuesize)
               cout<<" queue everflow occurs during enqueue "<<endl;
           else
           {
               q->last=(q->last+1)%queuesize;
               q->m[q->last]=x;
               q->count=q->count+1;

           }




       }

             int dequeue (queue *q)
             {
                 item_type x;
                 if(q->count<=0) cout<<"empthy queue "<<endl;
                 else
                 {
                     x=q->m[q->first];
                     q->first=(q->first+1)%queuesize;
                     q->count=q->count-1;
                 }
                 return (x);




                 }



             item_type headq(queue *q)
             {
                 return(q->m[q->first]);
             }
             int empthy(queue *q){


                 if (q->count<=0) return (TRUE);
                 else return (FALSE);
             }

 void print_queue(queue *q){
     int i;
     i=q->first;
     while(i!=q->last)
     {
         cout<<q->m[i];
         i=(i+1)%queuesize;
     }
     cout<<q->m[i]<<"  ";

 }
 int main(){
     queue *q;
     init_queue(q);
 int a;
 while(cin>>a){
     enqueue(q,a);




 }
 print_queue(q);


    return 0;
}

另请参阅队列头文件

#define  queuesize 1000
#include "item.h"

typedef struct
{
int  m[queuesize+1];
  int first;
  int last;
  int count;
  }queue;

错误是(实际)它不是错误只是警告当我编译,但当我运行它说局部变量q未初始化,所以哪个变量q?它是结构的名称,所以当我运行init_queue方法时它应该初始化是吗?

6 个答案:

答案 0 :(得分:3)

问题在于这两行代码。

 queue *q;
 init_queue(q);

init_queue内,您假设q通过使用->运算符解除引用来为其分配了一些内存。但它只是指向内存中随机地址的指针(因为它尚未初始化)。

q->first=0;
q->last=queuesize-1;
q->count=0;

要解决此问题,您应该添加

queue *q = new queue();

但是,由于您使用的是C ++,因此可能需要构建一个类来封装构造函数中的内存分配并释放析构函数中的内存。

更好的方法是遵循rageshctech的建议,避免使用手动内存分配,只使用堆栈上分配的东西(例如没有指针)。

答案 1 :(得分:3)

您必须实例化队列对象。

int main(){
 queue *q = new queue;
 init_queue(q);

使用q作为堆栈变量并传递地址。

int main(){
 queue q;
 init_queue(&q);

答案 2 :(得分:2)

  

是结构名称

不,q是一个指针 - queue - 对象。在main中,您尚未为q分配任何值,并且您甚至没有创建它可以指向的queue对象。所以q未初始化。

你应该这样做:

queue q;          // an instance of queue
queue *qptr = &q; // a pointer to that instance
// now use qptr (or &q) in place of q in the rest of the main function.

答案 3 :(得分:2)

 queue *q;      
init_queue(q); 

您没有为q分配内存。

queue * q =新队列;

您也可以在堆栈上分配队列:(推荐!)

queue q;
   init_queue(&q); 

答案 4 :(得分:1)

我想警告是关于q中的变量main?这是因为您将其定义为指针,但不分配它。将其定义为非指针,并在所有函数调用中使用&q,或为其分配内存:

queue *q = new queue;

return 0 main之前释放记忆:

delete q;

答案 5 :(得分:1)

您从未为队列分配内存。

使用非默认构造函数创建一个类而不是指针,而是使用它。

指针是C的东西。你是用C ++编写的:P