C/Visual C - lista siple error con char

 
Vista:

lista siple error con char

Publicado por guillermo (6 intervenciones) el 06/05/2010 22:55:45
tengo problema, veran en el codigo este debe pedir el ingreso de nombre y rut de n cantidad de persona.

el problema que se genera es cuando imprime ya que. no me toma el nombre pero si el rut. siendo la unica diferencia el tipo de dato. si alguien me ayudara estaria muy agradecido.


#include <stdio.h>
#include <stdlib.h>
/*Estructura del nodo con campo nombre, rut*/
typedef struct nodo
{
char *nombre;
int rut;
struct nodo *next;
}lista;
/*funcion main*/
int main()
{
lista *l1, *l2, *l3;
char salir;

/*inicializo l1*/
l1 = (lista *)malloc(sizeof(lista));
l1 ->nombre ="p"; l1 ->rut=0; l1 ->next=NULL;
/*l1 queda como la cabecera, y l3 lo usamos como nodo para avanzar*/
l3 = l1;
/*ingresamos datos*/
do
{
/*pedimos memoria para el auxiliar*/
l2 = (lista *)malloc(sizeof(lista));
printf("Ingrese nombre: ");gets(l2 ->nombre);
printf("Ingrese rut: ");scanf("%d",&l2 ->rut);
l2 ->next = NULL;
l3 -> next = l2;/*aca el nodo apunta a la lista anterior*/
l3 = l3 -> next;/*aca el nodo avanza*/
printf("Desea salir? ");scanf("%s",&salir);
printf("\n");

}while(salir != 's');

/*igualamos con la intencion de recoorer la lista desde el comienzo*/
l3=l1;
/*imprimir*/
while( l3 != NULL )
{
printf("%c\t",l3->nombre);printf("%d",l3->rut);
l3=l3->next;/*se apunta si mimsmo para poner fin al recorrido*/

printf("\n");
}

return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:lista siple error con char

Publicado por Capitan Kirk (97 intervenciones) el 07/05/2010 08:31:23
Dentro de la estructura, has declarado nombre como puntero a carácter, pero, ¿A dónde apunta ese puntero?. No lo has iniciado con ningún valor, con lo que estás usando un puntero sin iniciar, que puede conducirte al desastre. Decláralo como cadena de caracteres, por ejemplo,

char nombre[30]; // o la longitud que estimes conveniente

y ten en cuenta que el terminador de cadena de caracteres (ASCII 0 en C) forma parte de la cadena, o sea, que debes contar con él al estimar el tamaño.

Al hacerlo así, no puedes hacer una asignación a una cadena de caracteres, es decir, no puedes hacer

I1->nombre = "lo_que_sea";

Tienes que hacerlo mediante strcpy:

strcpy(cadena_destino, cadena_fuente);

por ejemplo,

strcpy(cadena_destino, "lo_que_sea");

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:lista siple error con char

Publicado por guillermo (2 intervenciones) el 07/05/2010 19:43:39
lo entiendo, pero no se supone que al usalr lista enlazadas no es necesario establecer un tamaño para el char. que incluso en el struct fue declarado *nombre.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:lista siple error con char

Publicado por guiilermo (1 intervención) el 08/05/2010 18:19:49
gracias kirk, pero ahora tengo otro poblema el programa que consistia en ingresar nombre y rut de un curso con N cantidad de alumnos, usando lista enlazada. Obviamente logre solucionar el correcto ingreso de datos, evitar que me imprimiera el nodo cabecera(Que generaba una rebundancia), pero el problema ahora es que solo imprime un registro. incluso si ingreso mas de 2 o N cantidad de nombre y rut, el codigo solo imprime el registro del primer nodo.

#include <stdio.h>
#include <stdlib.h>
/*Estructura del nodo con campo nombre, rut*/
typedef struct nodo
{
char nombre[20];
int rut;
struct nodo *next;
}lista;
/*funcion main*/
int main()
{
lista *l1, *l2, *l3;
char val;

/*inicializo l1*/
l1 = (lista *)malloc(sizeof(lista));
l1 ->nombre; l1->rut; l1 ->next=NULL;
/*l1 queda como la cabecera, y l3 lo usamos como nodo para avanzar*/
l3 = l1;
/*ingresamos datos*/
do
{
setbuf(stdin, NULL);
/*pedimos memoria para el auxiliar*/
l2 = (lista *)malloc(sizeof(lista));
printf("Ingrese nombre: ");gets(l2 ->nombre);
printf("Ingrese rut: ");scanf("%d",&l2 ->rut);
l2 ->next = NULL;

l3 -> next = l2;/*aca el nodo apunta a la lista anterior*/
l3 = l3 -> next;/*aca el nodo avanza*/

printf("Desea salir? [s/n] ");scanf("%s",&val);
printf("\n");
}while( !(val == 's' || val == 'S' ));
/*igualamos con la intencion de recorrer la lista desde el comienzo*/
l3 = l1;
l3 = l3 -> next;
/*imprimir*/
while( l3 != NULL )
{
printf("%s\t",l3->nombre);
printf("%d",l3->rut);
l3=l3->next;/*se apunta si mimsmo para poner fin al recorrido*/
printf("\n");
}

return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:lista siple error con char

Publicado por Capitan Kirk (97 intervenciones) el 10/05/2010 09:06:03
Sobre tu segunda respuesta, no voy a escribir el código completo, simplemente te dejo alguna sugerencia:

void Anadir_Nodo(lista *Nodo);
void Imprimir_Lista(lista *Nodo);

lista *Nodo1, *NodoActual;

int main(void)
{
Nodo1 = (lista *)malloc(sizeof(lista));
Nodo1->next = NULL;
NodoActual = Nodo1;
/*
Aquí vendría un menú con las opciones de añadir nodo, quitar nodo, salir, etc
*/
return 0;
}

void Anadir_Nodo(lista *Nodo)
{
lista *ptr;
ptr = Nodo;
// Buscamos el ultimo nodo de la lista
while (ptr->next != NULL) ptr = ptr->next
// Ya lo hemos encontrado, creamos un nuevo elemento y lo añadimos
ptr->next = (lista *)malloc(sizeof(lista));
ptr->next->next = NULL;
// Poner aquí código para introducir los datos
}

void Imprimir_Lista(lista *Nodo)
{
lista *ptr;
ptr = Nodo;
if (ptr != NULL) // Asegurar que es un nodo válido
while (1)
{
// Poner aquí el código para imprimir los datos
if (ptr->next == NULL) break; // Salimos del bucle si es el´último nodo
ptr = ptr->next;
}
}

Tendrás que añadir código para eliminar un nodo, para liberar la memoria reservada una vez que finaliza el programa, para insertar un nodo entre otros dos ya existentes, ..., también se podrán hacer algunos refinamientos, pero eso queda como ejercicio.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:lista siple error con char

Publicado por guillermo (1 intervención) el 12/05/2010 16:09:27
gracias men, tenisa razon con lo de cahr y no me impria por como declarba la lista. gracias por ayudarme
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:lista siple error con char

Publicado por Capitan Kirk (97 intervenciones) el 10/05/2010 08:30:17
Al definir una estructura de datos, solamente pudes poner elementos cuyo tamaño ya sea conocido. Puedes poner un puntero a la estructura de datos que está siendo definida porque, aunque aún no se conozca el tamaño de la estructura, un puntero es una variable que contiene una dirección, por tanto, de tamaño conocido (su tamaño está prefijado por el sistema). En el caso que nos ocupa, es decir, una lista enlazada, este puntero está destinado a contener la dirección en la que estará el siguiente elemento de la lista. Para añadir un nuevo elemento a la lista, harás algo como

elemento_actual->next = (lista *)malloc(sizeof(lista));

con lo que elemento_actual->next, ahora, sí contendrá la dirección de una estructura de datos válida.

En cambio, dentro de la estructura has declarado

char *nombre;

con lo que elemento->nombre contiene un puntero a carácter, que no sabes a dónde apunta. Te remito a mi primera respuesta.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar