2012-02-19 64 views
1

我想做一个简单的队列类。现在我被卡住了。它几乎完成。我发现只有一个“流行”功能导致了这个问题。任何人都可以告诉我该怎么做。使队列类错误

下面是代码:
(queue.h)

#ifndef _QUEUE_ 
#define _QUEUE 

#include <iostream> 
#include <string> 
using namespace std; 


struct Stuff 
{ 
    string name; 
    int roll; 
}; 


class Queue 
{ 
private: 

struct Node 
{ 
    Stuff data ; 
    struct Node * next; 
}; 
Node *front; 
Node *back; 
int qsize; 
const int MAX; 
public: 

Queue(int size = 5); 
~Queue(); 

bool isfull() const; 
bool isempty() const; 
int queuesize() const; 

bool push(const Stuff & item); 
bool pop(); 
Stuff first(); 
Stuff last(); 


}; 




#endif 

queue.cpp飞出后

#include <iostream> 
using namespace std; 
#include "queue.h" 

Queue::Queue(int size) 
:MAX(size) 
{ 
front = back = 0; 
qsize = 0; 

} 
bool Queue::isempty() const 
{ 
if(qsize == 0) 
    return true; 
else return false; 
} 
bool Queue::isfull() const 
{ 
if(qsize == MAX) 
    return true; 
else 
    return false; 
} 
Queue::~Queue() 
{ 
Node * temp; 
while(front != NULL) 
{ 
    temp = front; 
    front = front->next; 
    delete temp; 
} 

} 
int Queue::queuesize() const 
{ 
return qsize; 
} 

bool Queue::push(const Stuff & swag) 
{ 
if(isfull()) 
    return false; 

Node *add = new Node; 

if(add == NULL) 
    return false; 
add->data = swag; 
add->next = NULL; 

if(front == NULL) 
    front = add; 
else 
    back->next = add->next; 
back = add; 
qsize++; 

return true; 
} 


bool Queue::pop() 
{ 
if(isempty()) 
    return false; 
if(front == NULL) 
    return false; 
Node *temp =front; 


// I think this part is doing something wrong. 
front = front->next; 



delete temp; 
qsize--; 
if(qsize == 0) 
    back = NULL; 
return true; 

} 
Stuff Queue::first() 
{ 
return front->data; 
} 
Stuff Queue::last() 
{ 
return back->data; 
} 

的main.cpp

#include <iostream> 
#include "queue.h" 
#include <string> 
using namespace std; 

int main() 
{ 
Queue a(5); 
Stuff data; 
data.name = "icp"; 
data.roll= 755; 
a.push(data); 
Stuff x = a.last(); 

cout << x.name << "\t" << x.roll << endl; 
data.name = "sms"; 
data.roll= 12544; 
a.push(data); 
x = a.last(); 
cout << x.name << "\t" << x.roll << endl; 

data.name = "jmc"; 
data.roll= 98740; 
a.push(data); 
x = a.last(); 
cout << x.name << "\t" << x.roll << endl; 

cout << a.queuesize() << endl; 

///////////// 
x = a.first(); 
cout << x.name << "\t" << x.roll << endl; 
a.pop(); 

x = a.first(); 
cout << x.name << "\t" << x.roll << endl; 
a.pop(); 

x = a.first(); 
cout << x.name << "\t" << x.roll << endl; 
a.pop(); 


//// 
cin.get(); 
cin.get(); 
return 0; 
} 

程序崩溃第一个元素。 我指出了我认为会造成问题的部分。在此先感谢:)

+0

当你在调试器中运行你的代码时,你学到了什么? – 2012-02-19 12:43:59

回答

3

我认为问题是由推功能引起的。 以下代码

if(front == NULL) 
    front = add; 
else 
    back->next = add->next; 

背>下一个被设定为下一个添加 - >,这是NULL。 add->next = NULL;

的添加是下一个要回来,所以它应该是back->next = add;

你觉得在流行功能的问题,是因为前为NULL,所以front->next是错误的。

希望这可以帮助你。

+0

谢谢!有效。是的,这是推动功能有问题。道具! – InspiredCoder 2012-02-19 14:03:51

0

当使用具有指向动态分配对象的指针的类时,应该提供复制构造函数。默认赋值运算符一点一点地复制。当您返回一个对象时,它将被复制并删除。所以包含有用数据的指针被破坏,但我们仍然有一个指向它的指针。

我在调试器中运行了这段代码,错误信息是字符串(它有指向动态分配空间的指针)。