2016-09-09 6 views
2

以下は私のキュー実装です。私のキューは単に頭と後ろの2つのqノードの配列です。エンキューとデキューは、内部キューの実装を処理することになっています。このキューインプリメンテーションで何が問題になっていますか?

異なる整数でエンキューを呼び出すと、Q[0].next == Q[1].nextへの出力は1になります。私は間違いを理解することができません。

struct Qnode{ 
int index; 
struct Qnode *next; 
}; 
typedef struct Qnode qnode; 

qnode* makeQueue(){ 
    qnode *Q; 
    Q = (qnode *) malloc(2*sizeof(qnode)); 
    qnode head,tail; 
    head.next = NULL; 
    tail.next = NULL; 
    head.index = 0; 
    tail.index = -1; 
    Q[0] = head; 
    Q[1] = tail; 
    return Q; 
} 

void enQueue(qnode *Q, int index){ 
    qnode node,head = Q[0], rear = Q[1]; 
    node.index = index; 
    node.next = NULL; 
    if(head.next == NULL && rear.next == NULL){ 
     head.next = &node; 
     rear.next = &node; 
    } 
    else{ 
     (rear.next)->next = &node; 
     rear.next = &node; 
    } 
    Q[0].index = head.index + 1; 
} 

あなたはenQueue機能

qnode node,head = Q[0], rear = Q[1]; 
node.index = index; 
node.next = NULL; 
if(head.next == NULL && rear.next == NULL){ 
    head.next = &node; 
    rear.next = &node; 
} 

に問題があるおかげ

+0

malloc(2 * sizeof(qnode)); '? – Groo

+0

Q自体は2つのqノードの配列 –

+0

最初は2ノードの*配列*ではなく、*リンクリスト*になります。ヘッドノードは最初のノードを指すようにするか、 'NULL'。あなたの 'enqueue'関数は必要に応じてノードを割り当てるべきです。 [例](https://gist.github.com/mycodeschool/7510222)。 – Groo

答えて

0

は、上記のコードの断片はhead.nextrear.nextにローカルスコープ変数のアドレスを割り当てている:すなわち、割り当てられた変数をスタック。

node変数は、関数が終了するまで存在します。だから、これらのポインタへのアドレスは、関数の外有効ではありません。それは外の機能にアクセスすることは違法であり、Undefined Behavior

はまた、その関数に行われたすべての変更がQ配列に反映されません:あなたは配列要素のローカルスコープのコピーを変更しています。

+0

私は見る。私はノードをqnode *ノードに変更しようとしました。問題はまだ残っています –

+0

すべてのコードを再考する必要があります。その方法は間違っていて、必要なものではありません。データを保持する2つの要素の配列ではなく、リンクされたリストを実装する必要があります(おそらく)。 – LPs

+0

2番目の問題は、私がローカル変数である頭部と後部を変更していたことだと思います。コードは今動作します。ありがとう –

関連する問題