Программа не дает желаемого выхода.Неправильная реализация FIFO? - PullRequest
0 голосов
/ 30 августа 2011

Это программа FIFO, использующая linked list.Программа не дает желаемого результата, но генерирует длинный цикл, который через некоторое время останавливается, и появляется сообщение о том, что программа перестала работать.В чем проблема?

#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 ]

6 голосов
/ 30 августа 2011

Вы создаете queue s, а затем отказываетесь от них.

Вам не удается обновить dataNode_P_A, так что вы не создаете список столько, сколько tassel .

Вы вызываете dataNode_P_A++, когда явно не знаете, что это значит.

Вы написали длинный и сложный кусок кода, не проверяя его в процессе.

Вы должны начать все сначала и идти шаг за шагом.

4 голосов
/ 30 августа 2011

С чего начать ... Прежде всего, структура данных очереди особо не используется ни для чего. Но это не корень вашей проблемы. Это лежит здесь:

 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; 
   } 
}
0 голосов
/ 30 августа 2011

Вы должны отредактировать вашу 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.

...