这是使用linked list
的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++;
}
}
答案 0 :(得分:6)
您正在构建queue
然后放弃它们。
您无法更新dataNode_P_A
,因此您不会像流苏那样构建列表。
当您显然不知道它的含义时,您会调用dataNode_P_A++
。
你编写了一段冗长而复杂的代码而没有在路上进行测试。
你应该重新开始,然后一步一步地去。
答案 1 :(得分:4)
从哪里开始......首先,队列数据结构并不特别适用于任何事情。但那不是你问题的根源。那就在这里:
void displayQueue() {
while( dataNode_P_A != NULL ) {
cout << dataNode_P_A->data << endl;
dataNode_P_A++;
}
}
在遍历链接列表时,您可以通过导航到 - &gt; previous:
移动到下一个元素 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;
}
}
答案 2 :(得分:0)
您应该修改 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;
}
并按照@ Larry Osterman和@ Beta的建议保持一致。