该程序没有提供所需的输出。错误的FIFO实现?

时间:2011-08-30 14:04:51

标签: c++ visual-c++ data-structures queue fifo

这是使用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++;
    }
}

3 个答案:

答案 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的建议保持一致。