该程序没有给出所需的输出。错误的执行FIFO?
这是一个使用linked list
的FIFO程序。该程序没有给出所需的输出,但会产生一个长时间的循环,在某个时间后停止,并且有消息表明该程序已停止工作。问题是什么 ?该程序没有给出所需的输出。错误的执行FIFO?
#include <iostream>
using namespace std;
struct node {
int data;
struct node* previous; // This pointer keeps track of the address of the previous node
};
struct queue {
node* first;
node* last;
};
node* dataNode_P_A;
bool loop = true;
struct node* enterData();
struct node* enter_N_Data();
void displayQueue();
int main() {
struct node* dataNode= enterData();
while(loop) {
cout << "Want to enqueue ? Press y/n : ";
char ans;
cin >> ans;
if(ans == 'y') {
struct node* dataNode_N = enter_N_Data();
} else {
break;
}
}
displayQueue();
}
struct node* enterData() {
cout << "Enter the number : ";
dataNode_P_A = new node; // Now dataNode points to a chunk allocated to node
cin >> dataNode_P_A->data;
dataNode_P_A->previous = NULL; // this is set to NULL because no one follows till now
queue* q = new queue;
q->first = dataNode_P_A; // this pointer points to the first element
return dataNode_P_A;
}
struct node* enter_N_Data() {
cout << endl << "Enter the number : ";
node* dataNode = new node;
cin >> dataNode->data;
dataNode->previous = dataNode_P_A;
queue* q = new queue;
q->last = dataNode; // this pointer points to the last element
return dataNode;
}
void displayQueue() {
while(dataNode_P_A != NULL) {
cout << dataNode_P_A->data << endl;
dataNode_P_A++;
}
}
您正在构建queue
s,然后放弃它们。
您无法更新dataNode_P_A
,使你没有构建一个列表竟有如此流苏。
当你明确地不知道它的含义时,你调用dataNode_P_A++
。
您已经编写了一段很长且复杂的代码,而未对其进行测试。
你应该重新开始,并一步一步来。
Oooh,很好 - 我错过了enterData和Enter_N_Data都不更新dataNode_P_A的事实。 –
从哪里开始......首先关闭队列数据结构并不是特别用于任何事情。但这不是你问题的根源。这就出在这里:
void displayQueue() {
while(dataNode_P_A != NULL) {
cout << dataNode_P_A->data << endl;
dataNode_P_A++;
}
}
当通过链表迭代,你通过导航到移动到下一个元素 - >前面:
void displayQueue() {
while(dataNode_P_A != NULL) {
cout << dataNode_P_A->data << endl;
dataNode_P_A = dataNode_P_A->previous;
}
}
说了这么多,你正在做一些其他的事情,是有问题的 - 就像修改你的全局列表(dataNode_P_A)一样。在你的例子中,这不是一个问题,但如果你想对列表进行任何操作而不是显示它,这可能会成为问题。
这里的displayQueue的另一个版本,不存在这样的问题:
void displayQueue() {
node *entry = dataNode_P_A;
while(entry != NULL) {
cout << entry->data << endl;
entry = entry->previous;
}
}
“您可以通过导航到 - >上一个” “来移动到下一个元素。易于记忆,易于使用。 – unkulunkulu
'displayQueue'函数总是只显示** **输入的第一个数字,因为'dataNode_P_A'永远不会改变。我怎样才能克服这个问题? –
我想我有点困惑的问题 - dataNode_P_A永远不会为空,因为enterData在单个dataNode_P_A元素上创建。 –
您应该编辑您的enter_N_Data()
功能,如:
node* temp; // global as others in your program
struct node* enter_N_Data() {
cout << endl << "Enter the number : ";
node* dataNode = new node;
cin >> dataNode->data;
temp = new node;
temp = dataNode_P_A;
dataNode_P_A = dataNode; // update dataNode_P_A
dataNode->previous = temp;
queue* q = new queue;
q->last = dataNode; // this pointer points to the last element
return dataNode;
}
,并把一切都相同,而下面的建议@拉里奥斯特曼和@贝塔。
从来没有看到链接列表只有一个指向前一个节点的指针。 N –
嗯,奇怪。通常情况下,你会跟踪单链表中的下一个节点,而不是以前的... – trojanfoe
期望的输出是什么?什么是*实际*输出?它究竟在哪里停止工作?开始调试器的时间。 – razlebe