Foros del Web » Programación para mayores de 30 ;) » C/C++ »

insertar nodo al final de la lista

Estas en el tema de insertar nodo al final de la lista en el foro de C/C++ en Foros del Web. Hola, tengo el siguiente programa que consiste en añadir un nodo al principio y al final: En un fichero tengo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver ...
  #1 (permalink)  
Antiguo 15/05/2010, 11:03
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
insertar nodo al final de la lista

Hola, tengo el siguiente programa que consiste en añadir un nodo al principio y al final:

En un fichero tengo:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define T_NOM 101
  6. #define T_EDAD 3
  7.  
  8. struct persona {
  9.     char nom[100];
  10.     char edad[3];
  11.         struct persona *siguiente;
  12. };
  13.  
  14.  
  15. #define LEE_CAD(c,n) { int i=0; \
  16.                      c[i]=getchar();\
  17.              while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  18.              while ((c[i]!='\n') && (i < (n-1))){ \
  19.                 i++;\
  20.             c[i]=getchar(); }\
  21.              c[i]='\0'; }

En otro tengo el main:
Código C:
Ver original
  1. #include "estructura_de_datos.h"
  2.  
  3. int main(){
  4.          struct persona *lista=NULL;
  5.          struct persona *nodo;
  6.  
  7.          int op;
  8.          void alta_inicio();
  9.          void alta_final();
  10.          void recorrer_lista();
  11.                  
  12.          do{
  13.             do{
  14.                printf("Elija una opción:\n");
  15.                printf("1--> Añadir al principio.\n");
  16.                printf("2--> Añadir al final.\n");
  17.                printf("3--> Recorrer la lista.\n");
  18.                printf("4--> Salir.\n");
  19.                scanf("%d",&op);
  20.             }while((op < 1) || (op > 4));
  21.          if(op != 4)  
  22.             switch(op){
  23.                 case 1: { alta_inicio(&lista);break;}
  24.                 case 2: { alta_final(&lista);break;}
  25.                 case 3: { recorrer_lista(&lista);break;}
  26.             }
  27.          }while(op != 4);
  28.          exit(0);
  29. }
  30.  
  31. void alta_inicio(struct persona **lista){
  32.          struct persona *nuevo_nodo;
  33.          nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));
  34.          if(nuevo_nodo != NULL){
  35.             nuevo_nodo->siguiente = *lista;
  36.             *lista = nuevo_nodo;
  37.             printf("Nombre: ");
  38.             LEE_CAD(nuevo_nodo->nom,100);
  39.             printf("Edad: ");
  40.             LEE_CAD(nuevo_nodo->edad,3);
  41.          }
  42. }            
  43.  
  44. void alta_final(struct persona **lista){
  45.           struct persona *nuevo_nodo;
  46.           struct persona *nodo_aux;
  47.  
  48.           nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));
  49.           if(nuevo_nodo != NULL){
  50.              nodo_aux = *lista;
  51.              while(nodo_aux->siguiente != NULL)
  52.                 nodo_aux = nodo_aux->siguiente;
  53.                 nodo_aux->siguiente=nuevo_nodo;
  54.                 nuevo_nodo->siguiente=NULL;
  55.                 LEE_CAD(nuevo_nodo->nom,100);
  56.                 LEE_CAD(nuevo_nodo->edad,3);
  57.           }
  58.           else
  59.                printf("Error al tomar memoria del nuevo nodo.\n");
  60. }
  61.  
  62. void recorrer_lista(struct persona **lista){
  63.           struct persona *nodo_aux;
  64.           nodo_aux = *lista;
  65.           while(nodo_aux != NULL){
  66.                printf("%s\n",nodo_aux->nom);
  67.                printf("%s\n",nodo_aux->edad);
  68.                nodo_aux = nodo_aux->siguiente;
  69.           }
  70. }

Cuando lo compilo y le doy a añadir al principio me sale bien, pero cuando quiero añadir al final no hace nada.
  #2 (permalink)  
Antiguo 15/05/2010, 12:52
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: insertar nodo al final de la lista

Bien primero, debes considerar que al insertar al inicio pones unos mensajes. aunq supongo q ya te diste cuenta de eso. :D

Por otra parte, debes considerar el echo de que tambien puedes insertar al final, aun cuando la lista esta vacía. Para esto solo debes ver si la lista esta vacía, si si, solo debes hacer que lista apunte al nuevo nodo creado.

Por ultimo te recomiendo, la lectura de los valores a insertar lo hagas en una funcion aparte o en el programa principal.
  #3 (permalink)  
Antiguo 16/05/2010, 12:49
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: insertar nodo al final de la lista

En este mismo ejercicio he añadido la opción insertar después de un nodo determinado, lo he probado, pero no me acaba de funcionar. Alguien puede decirme si el subprograma tiene algún fallo?. Gracias

Código C:
Ver original
  1. void alta_despues_de(struct persona **lista){
  2.            struct persona *nuevo_nodo;
  3.            struct persona *nodo_aux;
  4.            char nom[100];
  5.            char edad[3];
  6.            int encontrado = 0;
  7.            
  8.            printf("Nombre a buscar para insertar después de el: ");
  9.            scanf("%99s",nom);
  10.            
  11.            nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));
  12.            
  13.  
  14.            if(nuevo_nodo != NULL){
  15.              nodo_aux = *lista;
  16.              while((nodo_aux->siguiente != NULL) && (!encontrado)){
  17.                   if(strcmp(nom,nodo_aux->nom) == 0)
  18.                      encontrado = 1;
  19.                   else{
  20.                        nodo_aux = nodo_aux->siguiente;
  21.                   }
  22.              }
  23.              if((nodo_aux->siguiente == NULL) && (!encontrado))
  24.                 if(strcmp(nom,nodo_aux->nom) == 0)
  25.                   encontrado = 1;
  26.  
  27.              if(encontrado){
  28.                 nuevo_nodo->siguiente=nodo_aux->siguiente;
  29.                 nodo_aux->siguiente=nuevo_nodo;
  30.                 printf("Nombre del nuevo elemento: ");
  31.                 scanf("%99s",nuevo_nodo->nom);
  32.              }
  33.              else{
  34.                   printf("Elemento no encontrado.\n");
  35.                   free(nuevo_nodo);
  36.              }
  37.            }
  38.            printf("Edad a buscar para insertar después de el: ");
  39.            scanf("%2s",edad);
  40.            nuevo_nodo=(struct persona *)malloc(sizeof(struct persona));
  41.  
  42.            if(nuevo_nodo != NULL){
  43.              nodo_aux = *lista;
  44.              while((nodo_aux->siguiente != NULL) && (!encontrado)){
  45.                   if(strcmp(edad,nodo_aux->edad) == 0)
  46.                      encontrado = 1;
  47.                   else{
  48.                        nodo_aux = nodo_aux->siguiente;
  49.                   }
  50.              }
  51.              if((nodo_aux->siguiente == NULL) && (!encontrado))
  52.                 if(strcmp(edad,nodo_aux->edad) == 0)
  53.                   encontrado = 1;
  54.  
  55.              if(encontrado){
  56.                 nuevo_nodo->siguiente=nodo_aux->siguiente;
  57.                 nodo_aux->siguiente=nuevo_nodo;
  58.                 printf("Edad del nuevo elemento: ");
  59.                 scanf("%2s",nuevo_nodo->edad);
  60.              }
  61.              else{
  62.                   printf("Elemento no encontrado.\n");
  63.                   free(nuevo_nodo);
  64.              }
  65.            }
  66. }

Etiquetas: final, lista, nodo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:47.