Advertisement
Electgpl

PC - Ejercicio Listas Enlasadas Steiner

Oct 23rd, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.84 KB | None | 0 0
  1. /*          LISTA06.C
  2. Manejo de listas, tiene la funcion que inserta un dato en una lista ordenada
  3. por precio. Debe tener en cuenta las distintas posibilidades:
  4. 1) Lista Vacia
  5. 2) Inserta antes del primero
  6. 3) Inserta luego del ultimo
  7. 4) Inserta al medio de la lista
  8. Tiene funciones para ordenar segun los datos
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <stdlib.h>
  14.  
  15. #define MAX_CHAR 30
  16.  
  17. typedef struct {
  18.     int cod;
  19.     float pre;
  20.     char *descr;
  21. } DATOS;
  22.  
  23. typedef struct _NODO {
  24.     DATOS *pd;
  25.     struct _NODO *proximo;
  26. } NODO;
  27.  
  28. typedef struct {
  29.     NODO *ultimo;
  30.     NODO *primero;
  31. } LISTA;
  32.  
  33. //-----------------------------------------------------
  34.  
  35. #define NIL (NODO *)0
  36.  
  37. void iniciar_cola(LISTA *pt) {
  38.     pt -> primero = NIL;
  39.     pt -> ultimo = NIL;
  40.     return;
  41. }
  42.  
  43. void poner_ultimo(LISTA *cola, int codi, float preci, char *s) {
  44.     NODO *aux;
  45.     char *auxstr;
  46.  
  47.     if((aux = (NODO *)malloc(sizeof(NODO))) == NIL) {
  48.         printf("Sin memoria para NODO");
  49.         exit(1);
  50.     }
  51.  
  52.     if((aux -> pd = (DATOS *)malloc(sizeof(DATOS))) == NULL) {
  53.         printf("Sin memoria para DATOS");
  54.         exit(1);
  55.     }
  56.  
  57.     if((auxstr = (char *)malloc(strlen(s))) == NULL) {
  58.         printf("Sin memoria para Strings");
  59.         exit(1);
  60.     }
  61.  
  62.     aux -> pd -> cod = codi;
  63.     aux -> pd -> pre = preci;
  64.     strcpy(auxstr,s);
  65.     aux -> pd -> descr = auxstr;
  66.  
  67.     if(cola -> primero == NIL)
  68.         cola -> primero = aux;
  69.     else
  70.         cola -> ultimo -> proximo = aux;
  71.  
  72.     cola -> ultimo = aux;
  73.     aux -> proximo = NIL;
  74.     return;
  75. }
  76.  
  77. NODO *sacar_primero(LISTA *cola) {
  78.     NODO *msg;
  79.    
  80.     if(cola -> primero == NIL)
  81.         return(NIL);
  82.    
  83.     msg = cola -> primero;
  84.     cola -> primero = msg -> proximo;
  85.  
  86.     if(cola -> ultimo == msg)
  87.         cola -> ultimo = NIL;
  88.  
  89.     return(msg);
  90. }
  91.  
  92. void listar_cola(LISTA *cola) {
  93.     int n = 0;
  94.     NODO *l;
  95.  
  96.     for(l = cola -> primero ; l != NIL ; l = l -> proximo) {
  97.         printf("%-15s : %d      %4d     %6.2f \n", l -> pd -> descr, n, l -> pd -> cod, l -> pd -> pre );
  98.         n++;
  99.     }
  100.  
  101.     return;
  102. }
  103.  
  104. void ord_list_pre(LISTA *cola) {
  105.     NODO *j, *i;
  106.     DATOS *temp;
  107.    
  108.     for(j = cola -> primero ; j != NIL ; j -> proximo)
  109.         for(i = j -> proximo ; i != NIL ; i = i -> proximo)
  110.             if(j -> pd -> pre > i -> pd -> pre){
  111.                 temp = j -> pd;
  112.                 j -> pd = i -> pd;
  113.                 i -> pd = temp;
  114.             }
  115.    
  116.     return;
  117. }
  118.  
  119. void ord_list_cod(LISTA *cola) {
  120.     NODO *j, *i;
  121.     DATOS *temp;
  122.     for(j = cola -> primero ; j != NIL ; j = j -> proximo)
  123.         for(i = j -> proximo ; i != NIL ; i = i -> proximo)
  124.             if(j -> pd -> cod > i -> pd -> cod) {
  125.                 temp = j -> pd;
  126.                 j -> pd = i -> pd;
  127.                 i -> pd = temp;
  128.             }
  129.  
  130.     return;
  131. }
  132.  
  133. void ord_list_descr(LISTA *cola) {
  134.     NODO *j, *i;
  135.     DATOS *temp;
  136.     for(j = cola -> primero ; j != NIL ; j = j -> proximo)
  137.         for(i = j -> proximo ; i != NIL ; i = i -> proximo)
  138.             if(strcmp(j -> pd -> descr , i -> pd -> descr) > 0) {
  139.                 temp = j -> pd;
  140.                 j -> pd = i -> pd;
  141.                 i -> pd = temp;
  142.             }
  143.  
  144.     return;
  145. }
  146.  
  147. void insertar_precio(LISTA *cola, int co, float pr, char *sn) {
  148.     NODO *j, *jant;
  149.     NODO *aux;
  150.     char *auxstr;
  151.  
  152.     if((aux = (NODO *)malloc(sizeof(NODO))) == NIL) {
  153.         printf("Sin memoria para NODO");
  154.         exit(1);
  155.     }
  156.  
  157.     if((aux -> pd = (DATOS *)malloc(sizeof(DATOS))) == NULL) {
  158.         printf("Sin memoria para DATOS");
  159.         exit(1);
  160.     }
  161.  
  162.     if((auxstr = (char *)malloc(strlen(sn)+2)) == NULL) {
  163.         printf("Sin memoria para Strings");
  164.         exit(1);
  165.     }
  166.  
  167.     aux -> pd -> cod = co;
  168.     aux -> pd -> pre = pr;
  169.     strcpy(auxstr,sn);
  170.     aux -> pd -> descr = auxstr;
  171.  
  172.     if(j == NIL) {
  173.         cola -> primero = cola -> ultimo = aux;
  174.         aux -> proximo = NIL;
  175.     }
  176.     else if( pr < j -> pd -> pre) {
  177.              aux -> proximo = j;
  178.              cola -> primero = aux;
  179.          }
  180.          else if( pr > cola -> ultimo -> pd -> pre) {
  181.                   cola -> ultimo -> proximo = aux;
  182.                   aux -> proximo = NIL;
  183.                   cola -> ultimo = aux;
  184.               }
  185.               else {
  186.                   while (j -> pd -> pre < pr) {
  187.                       jant = j;
  188.                       j = j -> proximo;
  189.                   }
  190.                   aux -> proximo = jant -> proximo;
  191.                   jant -> proximo = aux;
  192.               }
  193.  
  194.     return;
  195. }
  196.  
  197. void main(void) {
  198.     int codigo[] = {102, 103, 133, 124, 152, 127, 100, 0};
  199.     float precio[] = {10.3, 12.4, 4.02, 5.7, 2.3, 6.2, 12.5, 0};
  200.     char *descrip[] = {"Mecha", "Calibre", "Guias", "M01", "G7", "Sep", "Motor", "*"};
  201.  
  202.     int i;
  203.     NODO *ptr;
  204.     NODO *sacar_primero();
  205.     LISTA *cola1;
  206.  
  207.     clrscr();
  208.  
  209.     if((cola1 = (LISTA *)malloc(sizeof(LISTA))) == NULL) {
  210.         printf("Sin memoria para Header");
  211.         exit(1);
  212.     }
  213.  
  214.     iniciar_cola(cola1);
  215.  
  216.     for(i = 0 ; codigo[i] != 0 ; i++) {
  217.         poner_ultimo(cola1, codigo[i], precio[i], descrip[i]);
  218.     }
  219.  
  220.     printf("Vemos la lista... \n\n");
  221.     listar_cola(cola1);
  222.     ord_list_pre(cola1);
  223.     printf("\nLista ordenada por precio...: \n\n");
  224.     listar_cola(cola1);
  225.     ord_list_cod(cola1);
  226.     printf("\nLista ordenada por codigo...: \n\n");
  227.     listar_cola(cola1);
  228.     ord_list_descr(cola1);
  229.     printf("\nLista ordenada por descripcion...: \n\n");
  230.     listar_cola(cola1);
  231.     printf("\nSacamos el primero y agregamos ordenando por precio: \n\n");
  232.     sacar_primero(cola1);
  233.     insertar_precio(cola1, 323, 7.55, "Nuevo1");
  234.     insertar_precio(cola1, 444, 1.55, "Nuevo2");
  235.     insertar_precio(cola1, 883, 27.55, "Nuevo3");
  236.     listar_cola(cola1);
  237.  
  238.     exit(0);
  239.     return;
  240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement