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.
davy.ai
En la parte de
else
de la funcióncreate_node()
original, se asignan los valores del coeficiente y el exponente ar
y se asigna un nuevo bloque de memoria parar->next
. Luego,r
se mueve ar->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 nodor
al último nodo de la lista enlazada recorriendo la lista hasta que se llegue al último nodo, luego se establecez->next
comor
. 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.