【问题标题】:The program does not give the desired output . Wrong implementation of FIFO ?该程序没有给出所需的输出。 FIFO的错误实现?
【发布时间】:2011-08-30 14:04:51
【问题描述】:

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

【问题讨论】:

  • 从未见过只有指向前一个节点的指针的链表。 N
  • 嗯,奇怪。通常你会跟踪单链表中的下一个节点,而不是前一个......
  • 期望的输出是什么? 实际输出是什么?它究竟在哪里停止工作?是时候启动你的调试器了。
  • @TonyTheTiger:这是一个标准的单链表。是“下一个”还是“上一个”是任意的。
  • 对于 OP,先停止写 C。

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


【解决方案1】:

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

你没有更新dataNode_P_A,所以你构建的不是列表,而是流苏

当您显然不知道 dataNode_P_A++ 是什么意思时,您会调用它。

您编写了一段又长又复杂的代码,但没有一路测试。

你应该重新开始,一步一个脚印。

【讨论】:

  • 哦,好消息 - 我错过了 enterData 和 Enter_N_Data 都不会更新 dataNode_P_A 的事实。
【解决方案2】:

从哪里开始... 首先队列数据结构并没有特别用于任何事情。但这不是你问题的根源。就在这里:

 void displayQueue() { 
   while( dataNode_P_A != NULL ) { 
       cout << dataNode_P_A->data  << endl; 
       dataNode_P_A++; 
   } 
}

当遍历一个链表时,你通过导航到 ->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; 
   } 
}

【讨论】:

  • "你可以通过导航到下一个元素 ->previous" 容易记住,使用简单。
  • displayQueue 函数将始终只显示输入的第一个数字,因为dataNode_P_A 永远不会改变。我该如何克服这个问题?
  • 我想我对这个问题有点困惑 - dataNode_P_A 永远不会为空,因为 enterData 在单个 dataNode_P_A 元素上创建。
  • 另外看看 Beta 的回答——他发现了我错过的另一个问题——你没有更新 enterData 和 Enter_N_Data 中的 dataNode_P_A,这意味着全局列表没有更新。
【解决方案3】:

您应该编辑您的 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 的建议的同时保持一切不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多