| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
orlandopcr
Registrado: 10 Abr 2014 Mensajes: 2
| Publicado: 10/04/2014 12:10 pm | | | Título: [Solucionado]Problema lista enlazada y while |
| Hola buenas, estoy haciendo un programa, leer un archivo .txt que esta organizado de la siguiente forma:
rojo 1 2 3 azul 4 5 6 verde 7 8 9
a medida que lo leo con un ciclo while, ingreso los campos a una lista enlazada de la siguiente forma:
typedef struct nodo{ char *nombre; char *red; char *green; char *blue; struct nodo *siguiente; }tNodo;
typedef struct { tNodo *Inicio; tNodo *Fin; tNodo *Actual; int SizeLista; }tLista;
void IniciarLista(tLista *Lista){ tNodo *NewNodo =(tNodo*)malloc(sizeof(tNodo)); Lista->Inicio = NewNodo; Lista->Fin = NewNodo; Lista->Actual = NewNodo; Lista->SizeLista = 0; }
void AppendLista(tLista *Lista,char *nombre, char *rojo, char *verde, char *azul){ tNodo *NewNodo =(tNodo*)malloc(sizeof(tNodo)); NewNodo->red = rojo; NewNodo->green = verde; NewNodo->blue = azul; NewNodo->nombre = nombre; NewNodo->siguiente = NULL; Lista->Actual->siguiente = NewNodo; Lista->Actual=NewNodo; Lista->Fin=NewNodo; Lista->SizeLista++;
}
void RecorrerLista(tLista *Lista){ int incremento; Lista->Actual=Lista->Inicio; for(incremento=0;incremento<=Lista->SizeLista;incremento++){ printf("color recorrido: %s\n",Lista->Actual->nombre); Lista->Actual=Lista->Actual->siguiente; } }
int main(){
tLista *L; IniciarLista(L); FILE *archivo; archivo = fopen("colors.txt","rw"); char palabra[10]; char red[4]; char green[4]; char blue[4];
while (feof(archivo) == 0){ fscanf(archivo,"%s\n%s\n%s\n%s\n",palabra,red,green,blue); AppendLista(L,palabra,red,green,blue); } }
Ahora, mi problema es que si ruteo la lista por dentro del while, me aparece efectivamente que esta el nodo rojo azul y verde, en cambio si recorro la lista de afuera del wihle, me dice que todos los nodos son iguales al ultimo ingresado, alguien sabe por que ocurre esto? o que puedo hacer? cabe destacar que el .txt no tiene solo 3 elementos, es solo un ejemplo. alguien me pueda ayudar por favor!!
Ultima edición por orlandopcr el 18/04/2014 3:29 pm; editado 1 vez |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7517 Ubicación: Mexico
| Publicado: 13/04/2014 7:57 am | | | Título: |
| Los problemas se deben a como implementaste la lista (en el tipo lista tienes el campo "Actual" que no es necesario).
Para explicarlo paso a paso: 1) La función inicializar crea un nodo y su dirección se almacena en los campos Inicio, Fin y Actual, no solo no es necesario crear ese nodo, peor todavía, el valor de sus campos es no definido o "basura".
2) Al agregar un nodo con la función "AppendLista" actualizas los campos Actual y Fin pero no actualizas Inicio.
3) Al recorrer la lista con la función "RecorrerLista" utilizas el valor de Inicio pero en el paso 1 se le asigno la dirección en memoria de un nodo sin valores.
Ademas no deberías utilizar la función feof para procesar la entrada, en su lugar debes utilizar el valor de retorno de fscanf.
El ultimo paso es cambiar el tipo de los campos de "char *" a "char []" y utilizar la función strcpy para copiar las cadenas.
Con las correcciones:
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h>
typedef struct nodo { char nombre[10]; char red[4]; char green[4]; char blue[4]; struct nodo *siguiente; } tNodo;
typedef struct { tNodo *Inicio; tNodo *Fin; int SizeLista; } tLista;
void IniciarLista(tLista *Lista); void AppendLista(tLista *Lista, char *nombre, char *red, char *green, char *blue); void RecorrerLista(tLista *Lista);
int main(void) { FILE *entrada; char nombre[10]; char red[4]; char green[4]; char blue[4]; tLista lista; IniciarLista(&lista); if ((entrada = fopen("colors.txt","r")) != NULL) while (fscanf(entrada, "%s %s %s %s", nombre, red, green, blue) == 4) AppendLista(&lista, nombre, red, green, blue); fclose(entrada); RecorrerLista(&lista); /* Falta liberar la memoria utilizada por los nodos de la lista */ return 0; }
void IniciarLista(tLista *Lista) { Lista->Inicio = NULL; Lista->Fin = NULL; Lista->SizeLista = 0; }
void AppendLista(tLista *Lista, char *nombre, char *red, char *green, char *blue) { tNodo *NewNodo = malloc(sizeof *NewNodo); strcpy(NewNodo->nombre, nombre); strcpy(NewNodo->red, red); strcpy(NewNodo->green, green); strcpy(NewNodo->blue, blue); NewNodo->siguiente = NULL; if (Lista->Inicio == NULL) Lista->Inicio = NewNodo; else Lista->Fin->siguiente = NewNodo; Lista->Fin = NewNodo; }
void RecorrerLista(tLista *Lista) { tNodo *p; for (p = Lista->Inicio; p != NULL; p = p->siguiente) printf("%s\n%s\n%s\n%s\n", p->nombre, p->red, p->green, p->blue); } |
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 |
| | Volver arriba | |  | orlandopcr
Registrado: 10 Abr 2014 Mensajes: 2
| Publicado: 18/04/2014 3:28 pm | | | Título: Gracias |
| | Gracias compadre, muy bien explicado te pasaste |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |