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.

¿Hay alguna forma en C de crear nuevos nodos en una lista enlazada sin asignación de memoria?

Acabo de aprender el concepto de una lista enlazada en C y he intentado implementarla. Lo que hice fue crear un puntero “head” y un puntero “itr”. Para crear un nuevo nodo, inicializaba un nodo normalmente (sin usar punteros) y luego le adjuntaba un puntero.

struct node temp;  // Un solo nodo contiene un valor 'num' y un puntero al siguiente nodo.
temp.num = x;
temp.next = NULL;

if (head == NULL) {
    head = &temp;
} else {
    itr = head;
    while (itr->next != NULL) {
        itr = itr->next;
    }
    itr->next = &temp;
}

Este método no está funcionando y, según mi conocimiento limitado de los punteros en C, no puedo entender por qué. Sé que la forma correcta de hacerlo es usando “malloc” para crear nuevos nodos, pero necesito saber por qué este método no funciona.

Programa completo:

“`c
#include <stdio.h>

struct node {
int num;
struct node *next;
};

int main() {
struct node *head = NULL;
struct node *itr;
struct node temp;

<pre><code>int choice;
printf("1. Ingresar nuevo nodo, 2. Recorrer todos los nodos, 3. Salir.");

int x;
while (1) {
printf("\nIngrese su elección: ");
scanf("%d", &choice);

if (choice == 1) {
printf("Ingrese el valor: ");
scanf("%d", &x);

temp.num = x;
temp.next = NULL;

if (head == NULL) {
head = &temp;
} else {
itr = head;
while (itr->next != NULL) {
itr = itr->next;
}
itr->next = &temp;
}
} else if (choice == 2) {
if (head == NULL) {
printf("Lista vacía");
continue;
}
printf("Los valores son: ");
itr = head;
printf("%d ", itr->num);
while (itr->next != NULL) {
itr = itr->next;
printf("%d ", itr->num);
}
} else {
break;
}
}
</code></pre>

}
“`</stdio.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual este método no funciona es porque estás creando una estructura localmente en el bloque “if” y luego asignando su dirección al puntero “head”. Tan pronto como sales del bloque “if”, la estructura es eliminada y el puntero “head” ya no apunta a una ubicación de memoria válida.

    Esto lleva a un comportamiento indefinido, es por eso que no puedes crear una lista enlazada que funcione correctamente.

    Para crear un nuevo nodo, necesitas asignar memoria de forma dinámica utilizando malloc y luego asignar su dirección al puntero del nodo. Esta memoria estará disponible incluso después de que el bloque de código actual sea finalizado.

    Aquí te muestro cómo puedes modificar tu código para utilizar malloc y crear una lista enlazada correctamente:

    if(choice==1){
        printf("Ingrese el valor: ");
        scanf("%d", &x);
    
        struct node *temp = malloc(sizeof(struct node)); // asignar memoria para el nuevo nodo
        temp->num=x;
        temp->next=NULL;
    
        if(head==NULL){
            head=temp;
        }
        else{
            itr=head;
            while(itr->next!=NULL){
                itr=itr->next;
            }
            itr->next=temp;
        }
    }
    

    En este código modificado, estamos asignando memoria para el nuevo nodo utilizando malloc y luego asignando su dirección al puntero temp. Luego llenamos los campos del nodo temp y lo agregamos al final de la lista enlazada.

    Recuerda liberar la memoria asignada para cada nodo una vez que hayas terminado con ella para evitar fugas de memoria:

    struct node *temp = head;
    while(temp != NULL){
        struct node *next = temp->next;
        free(temp);
        temp = next;
    }
    

    Este código liberará la memoria asignada para cada nodo recorriendo la lista enlazada y utilizando la función free() para liberar la memoria.

Comments are closed.