es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lista Enlazada en C++ usando Struct

No comprendo la parte “else” en la función “create_node()”…
Como puedes ver en la parte “else”, se asigna un bloque de memoria para “r” y se asignan los valores “coeff” y “pow”…pero ¿cuándo asignan el nodo “r” al final de la lista enlazada? ¿cuándo recorren hasta el final de la lista enlazada?
Me refiero a cómo se asigna al final de la lista enlazada.


include <bits stdc++.h=""> using namespace std; struct Node { int coeff; int pow; struct Node* next; }; // Función para crear un nuevo nodo void create_node(int x, int y, struct Node* temp) { struct Node *r, *z; z = *temp; if (z == NULL) { r = (struct Node*)malloc(sizeof(struct Node)); r->coeff = x; r->pow = y; temp = r; r->next = (struct Node*)malloc(sizeof(struct Node)); r = r->next; r->next = NULL; } else { r->coeff = x; r->pow = y; r->next = (struct Node*)malloc(sizeof(struct Node)); r = r->next; r->next = NULL; } } // Mostrar lista enlazada void show(struct Node* node) { while (node->next != NULL) { printf("%dx^%d", node->coeff, node->pow); node = node->next; if (node->coeff >= 0) { if (node->next != NULL) printf("+"); } } } // Código del programa principal int main() { struct Node *poly1 = NULL, *poly2 = NULL, *poly = NULL; // Crear primera lista de 5x^2 + 4x^1 + 2x^0 create_node(5, 2, &poly1); create_node(4, 1, &poly1); create_node(2, 0, &poly1); // Crear segunda lista de -5x^1 - 5x^0 create_node(-5, 2, &poly2); create_node(-5, 0, &poly2); printf("1er Número: "); show(poly1); printf("\n2do Número: "); show(poly2); return 0; }

¿Soy el único que piensa que la función “create_node()” debería ser más como esto que el código anterior?

void create_node(int x, int y, struct Node** temp)
{

struct Node *r, *z;
z = *temp;
if (z == NULL) {
   r = (struct Node*)malloc(sizeof(struct Node));
    r->coeff = x;
    r->pow = y;
    r->next=NULL;
    *temp = r;
}
else {
    r = (struct Node*)malloc(sizeof(struct Node));
    r->coeff = x;
    r->pow = y;
    r->next=NULL;
    while(z->next!=NULL)
    {
        z=z->next;
    }
    z->next=r;
}

}

Realmente quiero saber cómo produce la salida correcta incluso sin asignar “newnode” al final de la lista enlazada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En la parte de else de la función create_node() original, se asignan los valores del coeficiente y el exponente a r y se asigna un nuevo bloque de memoria para r->next. Luego, r se mueve a r->next para estar listo para insertar los datos del próximo nodo.

    Sin embargo, como se menciona en la pregunta, r no se asigna al último nodo de la lista enlazada. En cambio, se crea un nodo extra al final que no se utiliza en la lista enlazada.

    La función create_node() editada sugerida en la pregunta es una implementación más apropiada. Asigna el nuevo nodo r al último nodo de la lista enlazada recorriendo la lista hasta que se llegue al último nodo, luego se establece z->next como r. Esto crea la estructura de lista enlazada deseada.

    No está claro por qué la implementación original produce la salida correcta incluso si no asigna correctamente el último nodo. Es posible que el nodo extra simplemente se ignore al imprimir. Sin embargo, no es una buena práctica de programación confiar en un comportamiento indefinido o en detalles de implementación, por lo que se debe utilizar la implementación editada en su lugar para una implementación adecuada.

Comments are closed.