[ Foro de C ]

Ayuda con listas dinamicas

05-Jan-2020 21:23
Gonzalo Ramirez
1 Respuestas

Estoy haciendo un programa que lea nombre del teclado y inserte cada nombre en los nodos de una lista para luego mostrarlos, cuando ingreso un solo nombre me lo muestra pero al ingresar mas el programa se me finaliza a la hora de mostrarlas, creo que el error esta en la función ENLISTAR, a continuación les dejo el código:

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

typedef struct t_nodo{

struct t_nodo *psig;
char *nombre;

}nodo;

typedef struct t_lista{

nodo *pinicio;
int tam;

}lista;

void inicializar (lista *l){

l->pinicio=NULL;
l->tam=0;

}

int enlistar (lista *l, char *nombre ){

nodo *aux;
nodo *nuevo_el;

if ((nuevo_el = (nodo *) malloc (sizeof (nodo))) == NULL)
   return -1;
 if ((nuevo_el->nombre = (char *) malloc (50 * sizeof (char)))
     == NULL)
   return -1;  
   
    strcpy(nuevo_el->nombre,nombre);

if(l->tam==0){

l->pinicio=nuevo_el;
}

else {
aux=l->pinicio;

while(aux->psig!=NULL){

aux=aux->psig;
}

aux->psig=nuevo_el;

}
nuevo_el->psig=NULL;
l->tam++;
}

void mostrar (lista *l){

nodo *aux;

aux=l->pinicio;

if(l->tam==1){

printf("Nombre: %s",aux->nombre);

}

else{


while(aux->psig!=NULL){

printf("Nombre: %s", aux->nombre);
aux=aux->psig;

}

}

}

int main(){

lista *ll;
char *nom;
bool opcion;

opcion=1;


if ((ll = (lista *) malloc (sizeof (lista))) == NULL)
   return -1;
 if ((nom = (char *) malloc (50 * sizeof (char))) == NULL)
   return -1;
   
    inicializar(ll);

while(opcion){


printf("Digite un nombre:");
scanf("%s",nom);

enlistar(ll,nom);

printf("Desea ingresar otro nombre? 1 SI / 0 N0: ");
scanf("%d",&opcion);

}
mostrar(ll);
}


07-Jan-2020 19:30
Jorge d r (+1)

Buenas por lo que he podido ver, el problema está en el while de la funcion mostrar, ya que utilizas el puntero a la estructura siguiente como  condicion de la  sentencia while.
Cuando llega a la última estructura el puntero siguiente es nulo y finaliza el while sin mostrar el último nombre.
Cambia la condicion, por ejemplo con la cantidad de estructuras "tam" y verás que te muestra todos los nombres.

Saludos






Si ya eres usuario del sistema, puedes contestar desde tu cuenta y así ganar prestigio.

Si sólo eres un visitante, puedes optar por...