elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda lista simple enlazada C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda lista simple enlazada C  (Leído 4,088 veces)
netca

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Duda lista simple enlazada C
« en: 12 Agosto 2012, 00:14 am »

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!

Código
  1. struct nodo_ {
  2. char* dato;
  3. struct nodo_ *sig;
  4. };
  5.  
  6. createList(struct nodo_ *list_D){
  7.         struct nodo_ listaTemporal = list_D;
  8.         char* a = "Hello";
  9.         char* b = "Televison";
  10.         char* x = "...."
  11.  
  12. //Inserto la cantidad de nodos que necesite , hasta n elementos
  13.  
  14.        listaTemporal->dato = a;
  15.        listaTemporal = listaTemporal->sig;
  16.        listaTemporal = malloc(sizeof(struct nodo_));
  17.  
  18.        listaTemporal->dato = b;
  19.        listaTemporal = listaTemporal->sig;
  20.        listaTemporal = malloc(sizeof(struct nodo_));
  21.  
  22.        //Insertamos n elementos
  23.        listaTemporal->sig = NULL;
  24. }
  25.  
  26. int main(){
  27.           struct nodo_ *list_D = malloc(sizeof(struct nodo_));
  28.           createList(list_D);
  29.           struct nodo_ aux = list_D;
  30.  
  31.           while(aux){
  32.                  printf("El valor de aux es %s\n",aux->dato);      //Solo imprime el primero
  33.                  aux = aux->sig;
  34.  
  35.            }
  36.  
  37.  
  38. }


« Última modificación: 12 Agosto 2012, 00:26 am por netca » En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Duda lista simple enlazada C
« Respuesta #1 en: 12 Agosto 2012, 00:58 am »

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.

Código
  1. struct lista* insertar_nodo(struct lista* l, struct dato x)
  2. {
  3. struct lista *q, *p;
  4.  
  5. q=(struct lista*)malloc(sizeof(struct lista)); // reservamos memoria para 1 nodo
  6.        //aqui rellenamos la estructura del nodo creado
  7. q->datos=x;
  8. q->sig=NULL; //NULL ya que sera el ultimo elemento de la lista
  9.  
  10. 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
  11.  
  12.        // si l ya tenia nodos, buscamos el ultimo para poder añadir el nuevo nodo
  13. p=l; //no usamos q ya que necesitamos la direccion del nuevo nodo creado
  14. while (p->sig != NULL) p=p->sig; //buscamos el ultimo nodo de la lista
  15. p->sig=q; //al ultimo nodo le asignamos a siguiente el nuevo nodo q
  16.  
  17. return l; //retornamos l, q era tanto parametro de la funcion como el valor de retorno
  18. }

y en el main, se usaria de esta manera para crear una lista con n nodos:
Código
  1. struct lista {
  2. struct dato datos;
  3. struct lista *sig;
  4. };
  5.  
  6. int main() {
  7.        struct dato d;
  8. struct lista *l=NULL;
  9.  
  10.        //(codigo.....)
  11.  
  12.        for (i=0; i<n; i++)
  13. l=insertar_nodo(l, d);
  14.  
  15.        //(Codigo.....)
  16. }

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


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda lista simple enlazada C
« Respuesta #2 en: 12 Agosto 2012, 01:05 am »

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.
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
En línea

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

Desconectado Desconectado

Mensajes: 54


Ver Perfil
Re: Duda lista simple enlazada C
« Respuesta #3 en: 16 Agosto 2012, 00:06 am »

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());
}   
« Última modificación: 16 Agosto 2012, 00:15 am por twins » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines