Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MessageBoxA en 2 Noviembre 2014, 04:06 am



Título: estructuras dinamicas
Publicado por: MessageBoxA en 2 Noviembre 2014, 04:06 am
SALUDOS A TODOS!!!!  ;D
bien quiero informar que se que aqui no se hacen tareas pero cuando la persona que solicita ayuda por lo menos ya a adelantado parte de su proyecto entonces se hace la ecepcion y se ayuda en algo a la persona y yo soy uno de esas personas, estoy haciendo un codigo y bueno e realizado parte de el pero estoy algo trancado y solicito de su ayuda colegas programadores

aqui el enunciado (algo largo)

Código
  1. La empresa disquera "TEMPTATIONS" desea obtener información rápida de sus CD´s e Intérpretes, es decir; que por el titulo de un CD desea conocer el interprete y, dado un intérprete conocer todos los CD´s que él posee.
  2. Se sabe que están disponibles las siguientes estructuras de listas, almacenadas en forma dinámica:
  3. LISTAS DE INTÉRPRETES: Sus nodos contienen la siguiente información:
  4. - Nombre del intérprete,
  5. - Apuntador al principio de la lista de CD´s que posee el interprete,
  6. - Apuntador al final de la lista de CD´s que posee ese interprete,
  7. - Apuntador al sucesor de la lista del intérprete.
  8. LISTAS DE CD´s: Sus nodos contienen la siguiente información:
  9. - Nombre del CD,
  10. - Apuntador al sucesor de la lista de CD´s de ese interprete.
  11. LISTA DE DISQUERAS:
  12. - Nombre de la Disquera,
  13. - Apuntador al sucesor de la lista de Disquera de ese CD.
  14. Nota: Suponga que un CD consta de un único interprete y de una sola disquera, y un intérprete puede tener uno o más CD´s y haber grabado con una o más disqueras.
  15. Basado en la información anterior:
  16. Diseñe un algoritmo y un programa en C, muestre un menú cuya primera opción sea para agregar los elementos de la lista, la segunda opción debe mostrar el nombre de los intérpretes y todos sus CD´s y estos a su vez la disquera, si este existe o envíe un mensaje de error en caso contrario, la opción de eliminar elementos de la lista y la última opción de salir.

y aqui mi code
Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4.  
  5. using namespace std;
  6.  
  7. typedef struct TEMPTATIONS
  8. {
  9.  char interprete[20];
  10.  char CDs[15];
  11.  TEMPTATIONS *siguiente;
  12.  } TEMPTATIONS;
  13.  
  14.  
  15. void mostrar_menu();
  16. void agregar_elemento();
  17. void mostrar_lista();
  18. void eliminar();
  19.  
  20. TEMPTATIONS *primero, *ultimo;
  21.  
  22. int main()
  23. {
  24.    char opcion;
  25.    primero=(TEMPTATIONS *)NULL;
  26.    ultimo=(TEMPTATIONS *)NULL;
  27.    do
  28.    {
  29.       mostrar_menu();
  30.       opcion=getche();
  31.       switch(opcion)
  32.       {
  33.  
  34.           case '1': agregar_elemento();
  35.           break;
  36.           case '2': mostrar_lista();
  37.           break;
  38.           case '3': eliminar();
  39.           break;
  40.           case '4': exit(1);
  41.  
  42.           default: printf("Opcion no valida\n");
  43.           break;
  44.       }
  45.    }while(opcion!='4');
  46.  
  47. }  
  48.  
  49.  
  50.   void mostrar_menu()
  51.   {
  52.      printf("1.- Anadir Interprete \n");
  53.  printf("2.- Mostrar Lista de Interpretes?\n");    
  54.  printf("3.- Eliminar Interprete?\n");
  55.      printf("4.- Salir\n\n");
  56.      printf("Escoge una opcion: \n");
  57.      fflush(stdin);
  58.  
  59.  
  60.   }
  61.  
  62.  void agregar_elemento()
  63.  {
  64.    TEMPTATIONS *nuevo;
  65.    nuevo=(TEMPTATIONS *)malloc(sizeof(TEMPTATIONS));
  66.    if(nuevo==NULL)
  67.     printf("No hay memoria disponible!!! \n");
  68.  
  69.     else
  70.     {
  71.             printf("\n");
  72.      printf("Agregar \n");
  73.      printf("Interprete: ");
  74.      fflush(stdin);
  75.      gets(nuevo->interprete);
  76.      printf("CDs: ");
  77.      fflush(stdin);
  78.      gets(nuevo->CDs);
  79.      nuevo->siguiente=NULL;
  80.  
  81.  
  82.       if(primero==NULL)
  83.       {
  84.  
  85.  
  86.  
  87.        primero=nuevo;
  88.        ultimo=nuevo;
  89.  
  90.       }
  91.       else
  92.       {                        
  93.       ultimo->siguiente=nuevo;
  94.       ultimo=nuevo;
  95.       }
  96.      }
  97.       system("pause");
  98.        system("cls");
  99.  }
  100.  
  101.  void mostrar_lista()
  102.  {
  103.    TEMPTATIONS *auxiliar;
  104.    int i;
  105.    i=0;
  106.    auxiliar=primero;
  107.    printf("\n Mostrando la lista completa:\n");
  108.    while(auxiliar!=NULL){    
  109.       printf("Interprete: %s, CDs: %s\n",auxiliar->interprete, auxiliar->CDs);
  110.       auxiliar= auxiliar->siguiente;
  111.       i++;
  112.  
  113.    }  
  114.    if(i==0){
  115.    printf("\nLa lista esta vacia!!\n");
  116.    }
  117.  }
  118.  
  119.   void eliminar()
  120.   {
  121.    TEMPTATIONS *aux2, *aux1, *auxiliar1;
  122.    int j, borralo;
  123.  
  124. auxiliar1=primero;
  125.     j=1;
  126.  
  127.      if(auxiliar1==NULL)
  128.      {
  129.        printf("--->La lista esta vacia\n");
  130.       }
  131.   else
  132.       {
  133.        while(auxiliar1!=NULL)
  134.        {
  135.     printf("\n %d Interprete: %s y su CDs es:%s \n",j,auxiliar1->interprete,auxiliar1->CDs);
  136.     auxiliar1=auxiliar1->siguiente;
  137.     j++;
  138.        }
  139.         printf("Cual desea eliminar\n");
  140.         scanf("%d",&borralo);
  141.         aux2=primero;
  142.        for(j=1;j<borralo-1;j++)
  143.        {
  144.           aux2=aux2->siguiente;
  145.        }
  146.         if(borralo==1)
  147.         {
  148.            primero=aux2->siguiente;
  149.            aux2->siguiente=NULL;
  150.         }
  151.                   else
  152.                   {
  153.                       aux1=aux2;
  154.                       aux2=aux2->siguiente;
  155.                       aux1->siguiente=aux2->siguiente;
  156.                       aux2->siguiente=NULL;
  157.                    }
  158.  
  159.        }
  160.         }


Título: Re: estructuras dinamicas
Publicado por: avesudra en 2 Noviembre 2014, 11:00 am
Hola MessageBoxA, está bien que des el código que llevas hasta ahora pero tiene que ser una duda concreta, ¿en que parte te quedas trabado?

Aprovecho para decirte que tu estructura no está completa si no me equivoco. Además, el enunciado te pide el programa en lenguaje C y tu has hecho una mezcla de C y C++ en tu código agregando la biblioteca conio.h que NO es portable.

Saludos.


Título: Re: estructuras dinamicas
Publicado por: MessageBoxA en 2 Noviembre 2014, 13:15 pm
bueno mi duda seria como hago las otras dos estructuras, en el enunciado dice que tengo que hacer una lista para los CDs y una lista para la disqueras y como la relaciono con la primera que hice que es la de "interprete"


Título: Re: estructuras dinamicas
Publicado por: eferion en 3 Noviembre 2014, 11:12 am
Nota inicial 1: El programa tienes que hacerlo en C, no en C++, por tanto sobra "using namespace".
Nota inicial 2: "fflush" está pensado para buffers de salida, no de entrada. fflush(stdin) puede dar resultados inesperados.

Necesitas crear 3 listas:

Código
  1. typedef struct Disquera
  2. {
  3.  char nombre[20];
  4.  struct Disquera* siguiente;
  5. } Disquera;
  6.  
  7. typedef struct Cd
  8. {
  9.  char nombre[20];
  10.  Disquera* disquera;
  11.  struct Cd* siguiente;
  12. } Cd;
  13.  
  14. typedef struct Interprete
  15. {
  16.  char nombre[20];
  17.  Cd* inicioListaCds;
  18.  Cd* finListaCds;
  19.  struct  Interprete* siguiente;
  20. } Interprete;

Al final la estructura que queda es la que sigue:

Tienes una lista de intérpretes, cada intérprete tiene su propia lista de Cds. De forma paralela hay una lista de disqueras, de tal forma que cada CD acaba apuntando a la disquera que le corresponde.

De esto se deduce que tu estructura TEMPTATIONS no es correcta, ya que ahí estás forzando a que la relación intérprete-cd sea 1-1.