Duda lista simple enlazada C

Iniciado por netca, 12 Agosto 2012, 00:14 AM

0 Miembros y 1 Visitante están viendo este tema.

netca

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;

           }


}

xiruko

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

rir3760

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 xiruko

Y 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.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

twins

#3
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());
}