[ Foro de C ]
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;
}
}
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 ;-)
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.)