2011-08-30 11 views
-2

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

Hmmm、strange。通常、単一リンクリスト内の次のノードを追跡しますが、前のノードは追跡しません。 – trojanfoe

+0

目的の出力は何ですか? *実際の出力とは何ですか?それが正確にどこで機能しなくなるのですか?あなたのデバッガを起動する時間。 – razlebe

答えて

6

あなたはqueue Sを構築し、それらを放棄しています。

あなたはタッセルほどリストを構築しないように、dataNode_P_Aの更新に失敗します。

意味が明確にわからないときは、dataNode_P_A++が呼び出されます。

途中でテストすることなく、複雑で複雑なコードを作成しました。

最初からやり直してください。

+0

よろしくお願いします。私は、enterDataとEnter_N_Dataの両方がdataNode_P_Aを更新しないという事実を忘れていました。 –

4

どこから始めますか?まず、キューのデータ構造は特に何も使用されていません。しかし、それはあなたの問題の根源ではありません。それはここにある:

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の別のバージョンです:

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

とによって提案に従いながら、同じすべてを保つ:

void displayQueue() { 
    node *entry = dataNode_P_A; 
    while(entry != NULL) { 
     cout << entry->data << endl; 
     entry = entry->previous; 
    } 
} 
+1

" - > previous"にナビゲートして次の要素に移動します。 使い方は簡単で覚えやすいです。 – unkulunkulu

+0

'displayQueue'関数は、' dataNode_P_A'が決して変更されないので、入力された最初の数字だけを** **表示します。これを克服することはできますか? –

+0

私はちょっと混乱していると思いますが、dataNode_P_Aはnullにはなりません。なぜなら、enterDataは単一のdataNode_P_A要素を作成するからです。 –

0

はあなたが好きなあなたのenter_N_Data()機能を編集する必要があります@ Larry Ostermanと@ Beta。