0

ちょっと、ループに while を使用するプログラムがありますが、なぜそれが無限ループになるのか本当に混乱しています

これは私のコードです

プリントボイド

public void print() {
    DoublyLinkedListNode current = first;
    while (current != null) {
        current.displayInfo();
        current = current.next;
    }//end while
}//end print


public DoublyLinkedListNode partition(DoublyLinkedList list,
        DoublyLinkedListNode first, DoublyLinkedListNode last) {
    DoublyLinkedListNode smallIndex = first;
    DoublyLinkedListNode index = smallIndex.next;
    DoublyLinkedListNode temp = new DoublyLinkedListNode();
    double pivot = first.ipk;
    while (index != temp.next) {
        if ((index.ipk) < pivot) {
            smallIndex = smallIndex.next;
            temp.ipk = index.ipk;
            index.ipk = smallIndex.ipk;
            smallIndex.ipk = temp.ipk;
        }
        index = index.next;
    }
    temp.ipk = first.ipk;
    first.ipk = smallIndex.ipk;
    smallIndex.ipk = temp.ipk;
    System.out.println("The list in partition is: ");
    list.print();
    System.out.print("\n");
    return first;
}

public void recQuickSort(DoublyLinkedList list, DoublyLinkedListNode first,
        DoublyLinkedListNode last) {
    while (first != last) {
        DoublyLinkedListNode pivotLocation = partition(list, first, last);
        recQuickSort(list, first, pivotLocation.back);
        recQuickSort(list, pivotLocation.next, last);
    }
}

主要

public static void main(String[] args) {
    DoublyLinkedList d = new DoublyLinkedList();
    d.insertNode("Apep", "123", 3.5);
    d.insertNode("Alex", "121", 3.2);
    d.insertNode("Kujul", "124", 3.1);
    d.insertNode("Fahmi", "125", 3.7);
    d.print();
    d.quickSort(d);
    d.print();
}

したがって、これらのコードから無限ループ出力が発生し、どれが私のプログラムから無限ループになっているのかわかりません。ありがとう。

4

2 に答える 2

6

一見すると、ループがオンになっwhile (first != last)ていて、これらの変数のいずれも再割り当てしていません。!=参照の等価性のチェック (「これらはまったく同じオブジェクトか」) は論理的な等価性 (Object.equals(Object)メソッドによる)ではないことに注意してください。したがって、first != lastそのループに入ると、そのループから抜け出すことはできません。

同様のことがwhile (index != temp.next)ループで以前に発生します。

デバッガーをお持ちの場合は、ステップ実行して、無限ループがどこにあるかを自分で把握しようとします。デバッガーの使用方法をまだ学習していない場合は、今が学習する絶好の機会です。System.out.println("here!")まだ時間がない場合は、デバッグ行 ( ) をさまざまな場所に出力するという定評のあるトリックに戻ることができます。きっとそのうちの1人は「ここ!ここ!ここ!ここ!」と言い始めるでしょう。無限ループに陥っている場所を正確に伝えます。

于 2013-05-29T15:13:25.227 に答える
0

あなたのリンク リストは双方向リンク リストです。そしてどういうわけか、内部ノードのいずれかが、next以前にアクセスした他の内部ノードへの参照を保持しています。

そのような場合にのみ、while無限ループに入ることができ、問題はコードの他の部分にあります。

于 2013-05-29T15:18:19.410 に答える