该程序没有给出所需的输出。错误的执行FIFO?

该程序没有给出所需的输出。错误的执行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++; 
    } 
} 
+3

从来没有看到链接列表只有一个指向前一个节点的指针。 N –

+0

嗯,奇怪。通常情况下,你会跟踪单链表中的下一个节点,而不是以前的... – trojanfoe

+0

期望的输出是什么?什么是*实际*输出?它究竟在哪里停止工作?开始调试器的时间。 – razlebe

您正在构建queue s,然后放弃它们。

您无法更新dataNode_P_A,使你没有构建一个列表竟有如此流苏

当你明确地不知道它的含义时,你调用dataNode_P_A++

您已经编写了一段很长且复杂的代码,而未对其进行测试。

你应该重新开始,并一步一步来。

+0

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; 
    } 
} 
+1

“您可以通过导航到 - >上一个” “来移动到下一个元素。易于记忆,易于使用。 – unkulunkulu

+0

'displayQueue'函数总是只显示** **输入的第一个数字,因为'dataNode_P_A'永远不会改变。我怎样才能克服这个问题? –

+0

我想我有点困惑的问题 - 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; 
} 

,并把一切都相同,而下面的建议@拉里奥斯特曼和@贝塔。