| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
purplestain
Registrado: 29 Oct 2007 Mensajes: 5
| Publicado: 30/11/2007 8:50 am | | | Título: Problema: Insertar al final de una lista |
| Hola a todos. Tengo un problema con el uso de listas. Estoy usando c, cargo desde un archivo binario cada nodo y los voy copiando a una lista en memoria, la funcion que uso me retorna un puntero al primer nodo de la lista (se que esta funcion funciona correctamente). Utilizo ese puntero que me devuelve como argumento en esta funcion:
| Código: | typedef struct { int num; char nom[30]; }t_valores; typedef struct nodo nodo; struct nodo { t_valores val; nodo *sig; };
nodo *nuevo (nodo *p) {nodo *prim,*nuevo; prim=p; nuevo=(nodo*)malloc(sizeof(nodo)); printf ("\nIngrese numero: ");fflush (stdin);scanf ("%d",&(nuevo->val).num); printf ("Ingrese nombre: ");fflush(stdin);gets((nuevo->val).nom); do {p=p->sig; }while(p->sig!=NULL); p->sig=nuevo; nuevo->sig=NULL; return prim; }
|
es una funcion que armé que supuestamente devuelve un puntero al primer nodo de la lista a la que se le agrega un nuevo nodo al final. Y la imprimo con este procedimiento:
| Código: | void imprimir (nodo *prim) {do { printf("\n%s\n",(prim->val).nom); printf("%d\n",(prim->val).num); prim=prim->sig; }while(prim->sig!=NULL); }
|
El tema es que cuando la imprimo con este procedimiento, me muestra todo la lista pero en el ultimo nodo imprime cualquier cosa (caracteres raros en nom y un numero equivocado en num, estos dos valores que muestra son siempre iguales, ingrese lo que ingrese por teclado en la funcion *nuevo). Agradeceria mucho si alguien puede revisar el codigo. Saludos! |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3837 Ubicación: Mexico
| Publicado: 01/12/2007 9:36 am | | | Título: |
| La funcion "imprimir" esta mal implementada ya que reventaria con una lista vacia o de un solo elemento y si la lista consistiera de dos o mas elementos no imprimiria correctamente el ultimo.
Las modificaciones a esa funcion para que funcione correctamente:
| Código: | void imprimir(nodo *p) { while (p != NULL){ printf("\n%s\n", p->val.nom); printf("%d\n", p->val.num); p = p->sig; } } |
En cuanto a la funcion "nuevo" en esta no emulas el paso por referencia, debido a esto tienes que llamar a la funcion en la forma:
| Código: | nodo *lista;
/* ... */
lista = NULL;
/* ... */
lista = nuevo(lista); |
Ya que de no llamarla en esa forma no podria modificarse el valor de la variable "lista" (el puntero apuntando al primer nodo de la lista).
Esa funcion no maneja el caso de una lista vacia (indicada con el valor NULL) y en caso de una lista con varios elementos el error seria similar al de la funcion "imprimir".
Las modificaciones a esa funcion para que funcione correctamente:
| Código: | nodo *nuevo(nodo *p) { nodo *nuevo; if ((nuevo = malloc(sizeof *nuevo)) == NULL) return NULL; printf("Ingrese numero: "); fflush(stdout); if (scanf("%d", &nuevo->val.num) != 1) return NULL; printf ("Ingrese nombre: "); fflush(stdout); if (fgets(nuevo->val.nom, 30, stdin) == NULL) return NULL; nuevo->sig = NULL; if (p == NULL) return nuevo; else { nodo *ultimo; for (ultimo = p; ultimo != NULL; ultimo = ultimo->sig) ; ultimo = nuevo; return p; } } |
Revisa si esto soluciona tu problema, si no es asi habria que revisar el codigo fuente (completo) del programa.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | purplestain
Registrado: 29 Oct 2007 Mensajes: 5
| Publicado: 01/12/2007 12:43 pm | | | Título: |
| gracias por la respuesta, te cuento que todas las modificaciones que me recomendas ya las habia contemplado y modificado despues de publicar el tema y me sigue produciendo el mismo error, te muestro el main provisorio que hice para probar las funciones:
| Código: |
void main () {nodo*lista,*lista_aux; lista_aux=NULL; lista=NULL; lista=cargar_lista();/*esta se que funciona, carga los datos de un archivo binario a la lista y retorna un puntero*/ lista_aux=nuevo(lista); imprimir (lista_aux); getch(); }
|
tambien probé modificando la funcion nuevo para pasar por referencia la lista y que no me retorne nada (modificando el main), y sigue produciendo el mismo error. La verdad que se me estan acabando las ideas. el error siempre es el mismo:
| Cita: | | me muestra todo la lista pero en el ultimo nodo imprime cualquier cosa (caracteres raros en nom y un numero equivocado en num, estos dos valores que muestra son siempre iguales, ingrese lo que ingrese por teclado en la funcion *nuevo). |
|
| | Volver arriba | |  | | david_celta
Registrado: 02 Jun 2005 Mensajes: 151
| Publicado: 01/12/2007 4:04 pm | | | Título: |
| | Código: | nodo * inserta final(nodo *p) { nodo *nuevo; if ((nuevo = malloc(sizeof *nuevo)) == NULL) return NULL; printf("Ingrese numero: "); fflush(stdout); if (scanf("%d", &nuevo->val.num) != 1) return NULL; printf ("Ingrese nombre: "); fflush(stdout); if (fgets(nuevo->val.nom, 30, stdin) == NULL) return NULL; nuevo->sig = NULL; if (p == NULL) return nuevo; else { while (p->sig!=NULL) { p=p->sig; }
p->sig=nuevo return p; } }
|
_________________ In all your fantasies, you always knew that man and mystery...
...were both in you... |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3837 Ubicación: Mexico
| Publicado: 01/12/2007 4:12 pm | | | Título: |
| | purplestain escribió: | La verdad que se me estan acabando las ideas. el error siempre es el mismo:
| Cita: | | me muestra todo la lista pero en el ultimo nodo imprime cualquier cosa (caracteres raros en nom y un numero equivocado en num, estos dos valores que muestra son siempre iguales, ingrese lo que ingrese por teclado en la funcion *nuevo). |
|
En ese caso lo mejor que puedes hacer para encontrar el error es publicar el codigo fuente completo del programa.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | 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
|
|
| |