[ Foro de C ]

Listas enlazadas no funciona

18-Mar-2021 10:24
Invitado (Ayudaa)
2 Respuestas

Hola amigos, estoy estudiando programación en c, me encuentro en lista enlazadas,
el usuario ingresara la cantidad de datos que desee, ingresara enteros y se deberian de imprimir ordenados, pero resulta que cuando mando a imprimir no me aparece nada en la pantalla, espero puedan ayudarme a entender porque ocurre eso y como lo puedo solucionar. Gracias, les dejo mi codigo

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


typedef struct Nodo{

int numero;
struct Nodo *siguiente;
}NODO;

void NuevoNodo(NODO *lista,int n);
void mostrar(NODO *lista);

int main()
{
NODO *lista = NULL;

int numero;

do{
printf("Ingrese algunos numeros (-1 para finalizar): ");
scanf("%d",&numero);
if(numero == -1) {
break;
}
else
NuevoNodo(lista,numero);
}while(numero != -1);

mostrar(lista);

return 0;
}

void NuevoNodo(NODO *lista,int n)
{
NODO *nuevo_nodo = (NODO*) malloc(sizeof(NODO));
nuevo_nodo->numero = n;

NODO *primer = lista;
NODO *ultimo;

while((primer != NULL) && (primer->numero < n)) {
ultimo = primer;
primer = primer->siguiente;
}

if(lista == primer) {
lista = nuevo_nodo;
}
else {
ultimo->siguiente = nuevo_nodo;
}

nuevo_nodo->siguiente = primer;

printf("Dato agregado %d correctamente\n",n);

}

void mostrar(NODO *lista)
{
NODO *nodito = (NODO*) malloc(sizeof(NODO));
nodito = lista;

while(nodito != NULL) {
printf("%d ",nodito->numero);
nodito = nodito->siguiente;
}
}


21-Mar-2021 16:36
Invitado (alonso)



hola ayudaa

básicamente en la función NuevoNodo
no tienes en cuenta que c pasa una
copia de los argumentos a las funciones.

con un puntero simple puedes modificar
el contenido de la dirección pero no
la dirección de ese puntero ya que si
la cambias, la estas cambiando en la
copia y al salir de la función se pierde.

por eso tienes que enviar la dirección
del puntero (&lista), para poder modificar
el contenido de puntero, si no su dirección
al salir de la función se pierde, pero el
contenido del puntero queda modificado

por eso tu estabas enviando una copia de
"lista" y no su dirección, con lo que podías
modificar a lo que apuntaba pero no la
propio puntero de la variable lista ya que
al salir se eliminaba

por ej mostrar, si funciona bien porque no
tienes que modificar el puntero lista

te paso tu código con esa modificación
https://www.onlinegdb.com/B1ahUkHNO

recuerda que te falta liberar la memoria

te paso un video curso sobre estructuras
de datos están muy bien y están implementadas
en c y java

https://www.makigas.es/series/estructuras-de-datos

saludos ;-)


22-Mar-2021 06:25
Invitado (cgamezca)

La variable "lista" pierde su valor por ser local a la función NuevoNodo.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


typedef struct Nodo{

int numero;
struct Nodo *siguiente;
}NODO;

NODO *NuevoNodo(NODO *lista,int n);
void mostrar(NODO *lista);

int main()
{
NODO *lista = NULL;

int numero;

do{
printf("Ingrese algunos numeros (-1 para finalizar): ");
scanf("%d",&numero);
if(numero == -1) {
break;
}
else
lista = NuevoNodo(lista,numero);
}while(numero != -1);

mostrar(lista);

return 0;
}

NODO *primer;
NODO *ultimo;
NODO *NuevoNodo(NODO *lista,int n)
{
NODO *nuevo_nodo = (NODO*) malloc(sizeof(NODO));
nuevo_nodo->numero = n;

primer = lista;

while((primer != NULL) && (primer->numero < n)) {
ultimo = primer;
primer = primer->siguiente;
}

if(lista == primer) {
lista = nuevo_nodo;
}
else {
ultimo->siguiente = nuevo_nodo;
}

nuevo_nodo->siguiente = primer;

printf("Dato agregado %d correctamente\n",n);

return lista;
}

void mostrar(NODO *lista)
{
NODO *nodito = (NODO*) malloc(sizeof(NODO));
nodito = lista;

while(nodito != NULL) {
printf("%d ",nodito->numero);
nodito = nodito->siguiente;
}
}






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)