2016-10-21 17 views
0

これは私が行ったラボのためのものです。これはC++を使って単純なキューを作成することです。奇妙な出力を与えるCout

#include "Task5.h" 
#include <iostream> 
using namespace std; 

void push(const long &i, node* &n) { 
    if (n == NULL) { 
     node *ptr = new node; 
     ptr -> item = i; 
     ptr -> next = NULL; 
     n = ptr; 
     cout << "Created New Node." << endl; 
    } 
    else { 
     node *ptr = n; 
     cout << "Created Pointer" << endl; 
     while (ptr -> next != NULL){ 
      cout << "Finding Next..." << endl; 
      ptr = ptr -> next; 
     } 
     cout << "I'm here." << endl; 
     node *temp = new node; 
     temp -> item = i; 
     ptr -> next = temp; 
     cout << "Node Created." << endl; 
    } 
} 

long pop(node* &n) { 
    if (n == NULL) cout << "HEY!!! Can't pop an empty queue." << endl; 
    else { 
     long val; 
     node *ptr = n; 
     n = n -> next; 
     val = ptr -> item; 
     delete ptr; 
     return val; 
    } 
} 

int main() { 
    node *head = NULL; 
    push(13,head); 
    push(10,head); 
    push(18,head); 
    push(22,head); 
    cout << pop(head) << endl; 
    cout << pop(head) << endl; 
    cout << pop(head) << endl; 
    cout << pop(head) << endl; 
    cout << pop(head) << endl; 
    cout << pop(head) << endl; 
} 

これは、次のような出力を与えている:

Created New Node. 
Created Pointer 
I'm Here. 
Node Created. 
Created Pointer 
Finding Next... 
I'm here. 
Node Created. 
Created Pointer 
Finding Next... 
Finding Next... 
I'm here. 
Node Created. 
13 
10 
18 
22 
HEY!!! Can't pop an empty queue. 
6296192 
HEY!!! Can't pop an empty queue. 
6296192 

だから、最終的な結果は、コードが動作するということです。しかし、それはランダムに6296192を出力します。多分私は何かを間違って綴じると思ったか、吹き出しがエンドを変換していると思った16進数へ。私の研究室のインストラクターも何が起こっているのか分かりません。誰かが何が起こっているか教えてもらえますか?役立つなら、私はこのコードをLinux実行端末経由で実行しています。

ありがとうございます。

+6

Q:空のキューをポップしようとすると、pop()はどのような値を返しますか? – Mat

+2

コンパイラの警告を立てたり、 "pop"関数で "すべての制御パスが値を返すわけではない"という警告を無視して停止します。それは最初に何かが間違っているかもしれない手がかりだったでしょう。私は "ラボインストラクターも考えていない"ことを願っています、実際には真実ではなく、彼らはあなた自身でそれを見つけることを望んでいました。もしそうでなければ、価値あるもののためにあなたに与えるすべてのものを取ってください(多分そうではないでしょう)。 – WhozCraig

+0

@ NathanOliverは、停止問題の決定不能のために、そうしています。 – Quentin

答えて

2

:あなたはn == NULLの場合は何も返さない

long pop(node* &n) { 

はtrueです。したがって、これはUBであり、このようなランダムな値が出力にも発生する可能性があります。

+0

ああ、意味があります。ありがとう。私はそれが何か愚かなXDだったことを知っていた –

1

最初のcout << pop(head) << endl;のブレークポイントでデバッガを使用し、毎回ポップアップから返される値を見ることをお勧めします。

また、コンパイラはおそらく、問題の原因についての警告を表示しています。通常は、意図しない何かが発生するという警告に常に注意してください。

cout << pop(head) << endl;pop()によって返される値を使用しますが、空のキューの場合は値が返されず、結果として未定義の動作が発生します。あなたの関数で