Tengo la siguiente estructura , y en el main cuando voy a imprimir solo imprime el primer elemento , se que tiene que ver algo con el malloc y la inicializacion de la lista pero no se como hacerlo y tampoco se porque me ocurre esto. Si alguien me pudiera ayudar estaria agradecido. Saludos!
struct nodo_ {
char* dato;
struct nodo_ *sig;
};
createList(struct nodo_ *list_D){
struct nodo_ listaTemporal = list_D;
char* a = "Hello";
char* b = "Televison";
char* x = "...."
//Inserto la cantidad de nodos que necesite , hasta n elementos
listaTemporal->dato = a;
listaTemporal = listaTemporal->sig;
listaTemporal = malloc(sizeof(struct nodo_));
listaTemporal->dato = b;
listaTemporal = listaTemporal->sig;
listaTemporal = malloc(sizeof(struct nodo_));
//Insertamos n elementos
listaTemporal->sig = NULL;
}
int main(){
struct nodo_ *list_D = malloc(sizeof(struct nodo_));
createList(list_D);
struct nodo_ aux = list_D;
while(aux){
printf("El valor de aux es %s\n",aux->dato); //Solo imprime el primero
aux = aux->sig;
}
}
no acabo de entender tu codigo, mezclas en asignaciones punteros y structs, ademas de que a mi parecer esta algo desordenado... para arreglar esto, deberias tener una funcion que te inserte 1 nodo en la lista, 1 funcion que te elimine 1 nodo de la lista, y una funcion que te elimine la lista entera. luego otra funcion que te permita buscar cosas en ella. te dejo la funcion para crear 1 nodo, con el trozo de codigo en el main para hacer n nodos, y asi veras donde te has equivocado.
struct lista* insertar_nodo(struct lista* l, struct dato x)
{
struct lista *q, *p;
q=(struct lista*)malloc(sizeof(struct lista)); // reservamos memoria para 1 nodo
//aqui rellenamos la estructura del nodo creado
q->datos=x;
q->sig=NULL; //NULL ya que sera el ultimo elemento de la lista
if (l == NULL) return q; // si el puntero l de los parametros era NULL, retornamos el nodo creado ya que sera el unico elemento de la lista
// si l ya tenia nodos, buscamos el ultimo para poder añadir el nuevo nodo
p=l; //no usamos q ya que necesitamos la direccion del nuevo nodo creado
while (p->sig != NULL) p=p->sig; //buscamos el ultimo nodo de la lista
p->sig=q; //al ultimo nodo le asignamos a siguiente el nuevo nodo q
return l; //retornamos l, q era tanto parametro de la funcion como el valor de retorno
}
y en el main, se usaria de esta manera para crear una lista con n nodos:
struct lista {
struct dato datos;
struct lista *sig;
};
int main() {
struct dato d;
struct lista *l=NULL;
//(codigo.....)
for (i=0; i<n; i++)
l=insertar_nodo(l, d);
//(Codigo.....)
}
si quieres que te pase el codigo entero dimelo, era un problema bastante divertido que posteo un usuario el foro hace tiempo, aunque es algo largo y por eso no lo postee. un saludo
Cita de: netca en 12 Agosto 2012, 00:14 AMTengo la siguiente estructura , y en el main cuando voy a imprimir solo imprime el primer elemento , se que tiene que ver algo con el malloc y la inicializacion de la lista pero no se como hacerlo y tampoco se porque me ocurre esto.
La respuesta a porque no funciona ya la tienes cortesía del mensaje de
xirukoY si no tienes un curso de calidad sobre listas vinculadas en C uno muy bueno (pero en ingles) lo puedes descargar desde la pagina de la Stanford CS Education Library (http://cslibrary.stanford.edu/).
Un saludo
bien aqui tienes una lista bien implementada con metodo menu, ahora si la estructura esta declarada de forma global no es necesario pasarla como paramerto a las funciones, saludos y cualquier cosa me preguntas aaa y algo mas los datos los ingresa al inicio de la lista por lo tanto el ultimo dato que ingreses sera el primero cuando se imprima ::)
#include<stdio.h>
#include<stdlib.h>
typedef struct dato{
char palabra[20];
struct dato *sig;
}nodo;
nodo *cabeza=NULL,*final=NULL;
nodo *creanodo();
void ingresaalinicio();
void imprimir();
int pide();
int menu();
int main(void){
int opc;
do{
opc=menu();
switch(opc){
case 1:
ingresaalinicio();
break;
case 2:
imprimir();
break;
case 0:
return(0);
default:
printf("la opcion no esta en el menu\n\n");
}
}while(opc!=0);
return(0);
}
nodo *creanodo(){
nodo *nuevo=(nodo *)malloc(sizeof(struct dato));
printf("ingrese palabra\n");
fflush(stdin);
gets(nuevo->palabra);
nuevo->sig=NULL;
return(nuevo);
}
void ingresaalinicio(){
nodo *nuevo=creanodo();
if(cabeza==NULL)
final=nuevo;
else
nuevo->sig=cabeza;
cabeza=nuevo;
}
void imprimir(){
nodo *aux=cabeza;
printf("lista=");
while(aux!=NULL){
printf("[%s]->",aux->palabra);
aux=aux->sig;
}
printf("NULL\n");
}
int pide(){
int num;
printf("ingrese opcion\n");
scanf("%i",&num);
return(num);
}
int menu(){
printf("1 ingresar al inicio\n2 imprimir\n0 salir\n");
return(pide());
}