0

私のノードは整数値を持っています。そして、私は私のプログラムがそのような値を使用して2つのノードを交換することを望みます:

void reemplazarNodosConValores(int a,int b) {
    node *antecedenteDelPrimero = antecedentePorValor(a);
    node *antecedenteDelSegundo = antecedentePorValor(b);
    node *primero = nodoPorValor(a);
    node *segundo = nodoPorValor(b);
    node *nextDelPrimero = siguienteNodo(primero);
    node *nextDelSegundo = siguienteNodo(segundo);


    antecedenteDelSegundo->next = primero;
    primero->next = nextDelSegundo;

    antecedenteDelPrimero->next = segundo;
    segundo->next = nextDelPrimero;
}

ご覧のとおり、6つの変数を作成します。2つのノード。それぞれの前のノード。そして、それぞれの後のノード。

次に、スワップを行います。

ただし、ノードを印刷しようとすると、スワッピングによって無限ループが発生するようです。

私はこの答えに基づいてスワップを作成しました:https ://stackoverflow.com/a/1536011/555690

編集:要求に応じて、他の機能:

node *antecedentePorValor(int x) {
    node *resultado = NULL;
    for (int i = 0; i < counter; ++i) {
        resultado = siguienteNodo(resultado);
        if (siguienteNodo(resultado)) {
            if (siguienteNodo(resultado)->data == x) {
                break;
            }
        }
    }
    return resultado;
}

node *nodoPorValor(int x) {
    node *resultado = head;
    for (int i = 1; i < counter; ++i) {
        if (resultado->data == x) {
            break;
        }
        resultado = resultado->next;
    }
    return resultado;
}

node *siguienteNodo(node *nodo) {
    node *resultado;
    if (nodo) {
        resultado = nodo->next;
    }else{
        resultado = head;
    }
    return resultado;
}
4

1 に答える 1

2

注意が必要なケースがいくつかあります

  1. 値のあるノードは、値bのあるノードの直後に続くか、aまたはその逆です。
  2. 値を持つノードaまたはbはリストの最初のノードです
  3. a値または値を持つノードが複数ありますb

antecedentePorValor関数とのコードを見ずに、ケース2とケース3のどちらに問題があるかを判断することはできませんnodoPorValor。ケース#1にバグがあります。

編集:#1にバグがある理由を示すために、node(a)がnode(b)を指していると仮定し、次に

void reemplazarNodosConValores(int a,int b) {
    node *antecedenteDelPrimero = antecedentePorValor(a); // node preceding a
    node *antecedenteDelSegundo = antecedentePorValor(b); // node preceding b (a)
    node *primero = nodoPorValor(a);                      // node that contains a
    node *segundo = nodoPorValor(b);                      // node that contains b
    node *nextDelPrimero = siguienteNodo(primero);        // node following a (b)
    node *nextDelSegundo = siguienteNodo(segundo);        // node following b


    antecedenteDelSegundo->next = primero; // a->next = a
    primero->next = nextDelSegundo;        // a->next = node following b

    antecedenteDelPrimero->next = segundo; // preva->next = b
    segundo->next = nextDelPrimero;        // b->next = b <<== b points to self!!
}

コメントでは、私は略記prevaを意味antecedenteDelPrimeroa、意味primeroし、b意味するために使用しましsegundoた。

于 2012-10-07T02:58:41.717 に答える