2012-02-09 6 views
1

デキューメソッドをLinkedList ADTの実装に使用しようとしています。ただし、終了の代わりにキューの先頭から削除しています。これに関する助け?私はCには新しく、CにJavaのエクササイズを移植しようとしています。リストの最後のノードを削除することになっています。ここでLinkedListでのデキュー

は私のデキュー方法です:

static void linkedQueueDequeue(Queue* q) { 
    LinkedQueue *lq = ((LinkedQueue*)q->privateData); 
    Node* temp = lq->head->next; 
    lq->head->data = lq->head->next->data; 
    lq->head->next = temp->next; 
    free(temp); 
    lq->size--; 


} 

最後のノードをデキューしようとすると、ここで出力です:

===================== 
|Testing LinkedQueue| 
===================== 
adding 1 to first node 
adding 2 to second node 
adding 3 to third node 
adding 4 to fourth node 
[1,2,3,4] 
dequeue last node 
should print [1,2,3] 
[2,3,4] 
return first node 
peek: 2 
what's the size? 
size: 3 
+0

あなたのコードは、リストの先頭を明確に削除します。代わりにリストの末尾に何をしようとしましたか? – Mat

+0

ヒント:最後のノードを削除する場合は、リンクされたリストを2番目の最後の要素までトラバースし、最後の要素を削除する必要があります。 –

+0

は、最後のノードを取得するためにwhileループが必要なようです。 –

答えて

1

すでに見たように、linkedQueueDequeue内のコードを使用すると、スタック(LIFO)を望んでいたかのように、あなたはそれがtemp->nextだ削除、リストの最後にあなたのtempを繰り返すことができます最初のエントリをポップ:

static void linkedQueueDequeue(Queue* q) { 
    LinkedQueue *lq = ((LinkedQueue*)q->privateData); 
    Node* temp = lq->head->next; 
    while(temp->next) temp = temp->next; 
    free(temp->next); 
    temp->next = 0; 
    lq->size--; 
} 

2行目の変換(LinkedQueue*)qを考慮して、Queue/LinkedQueue実装について少し奇妙なことはないことにも注意してください。キャストが必要ですか?あなたが私たちにQueueとLinkedQueueの定義を与えなかったので、私は本当に告げることができません。 LinkedQueue->tailも含まれていますか?その場合は、繰り返しは必要ありません。代わりにtempの位置に->tailを使用することができます(もちろん、新しいエンドには->tailを更新する必要があります)。

+0

それは、ありがとう!次のノードにどのように反復するかはわかりませんでしたが、今考えてみると単純すぎるようです。リンクされたリストは常に私の最悪の敵でした。 – ChrisDevWard

+1

'リンクされたリストはいつも私の最悪の敵でした ':彼らはあなたの親友まで;-) –

0

あなたの出力は、第1の点でキュー/ FIFOの正しい行動であるように思われますリストから削除される項目は、リストに追加された最初の項目です。代わりにスタックを作成しようとしていますか?