/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

[Solucionado]Problema lista enlazada y while

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
orlandopcr



Registrado: 10 Abr 2014
Mensajes: 2

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 18/04/2014 3:28 pm
Título: Gracias

Gracias compadre, muy bien explicado te pasaste
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com