我正在尝试创建一个简单的Queue类。现在我被卡住了。它几乎完整。我已经发现只有一个函数“pop”导致了这个问题。任何人都可以告诉我该怎么做。
这是代码:
(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 :(得分:3)
我认为问题是由推送功能引起的。 以下代码
if(front == NULL)
front = add;
else
back->next = add->next;
back-&gt; next设置为add-&gt; next,为NULL。 add->next = NULL;
添加是下一个,所以它应该是back->next = add;
你认为pop函数中的问题是因为前面是NULL,所以front->next
是错误的。
希望这可以帮到你。
答案 1 :(得分:0)
当使用具有指向动态分配对象的指针的类时,应该提供复制构造函数。默认赋值运算符逐位复制。当您返回一个对象时,它将被复制然后删除。所以包含有用数据的指针,数据被销毁但我们仍然有一个指向它的指针。
我在调试器中运行此代码,错误在字符串中(其中包含指向动态分配空间的指针)。