Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/11/2014, 05:39
yeraypg
 
Fecha de Ingreso: octubre-2014
Ubicación: Cornellá de Llobregat
Mensajes: 8
Antigüedad: 9 años, 6 meses
Puntos: 2
Insertar elemento en lista ordeanda

Hola, a ver si me podeis hechar una mano con esto:

Tengo una lista y le tengo que poder insertar elementos, pero al insertarlos tienen que estar ordenados de menor a mayor. Tengo los siguientes ficheros y tengo que modificar la función insertarPrimero para que me añada los elementos ordenadamente. He probado varias cosas y no me han salido, así que os dejo el código para ver si me podéis hechar una mano.

Este es el archivo de las funciones:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "Estudiante.h"
  4.  
  5.  
  6. void nuevaLista (tipo_Nodo **lista){
  7.    *lista = NULL;
  8. }
  9.  
  10. tipo_Nodo *getNode (tipo_info elemento){
  11.    tipo_Nodo *p;
  12.    /*Asigna memoria dinamicamente para un solo nodo*/
  13.    p = (tipo_Nodo *) malloc(sizeof(tipo_Nodo));
  14.    if (p != NULL)         /*Si obtuvo un nodo (p) de la memoria...*/
  15.       {
  16.        p->info = elemento;     /*guarda elemento en info*/
  17.        p->next = NULL;         /*next apunta a NULL*/
  18.       }
  19.    return p;
  20. }
  21.  
  22. int listaVacia (tipo_Nodo *lista){
  23.    if (lista == NULL)
  24.       return (1);          /*retorna 1 (Exito). Lista vacia*/
  25.    else
  26.       return (0);          /*retorna 0 (Error). Lista no vacia*/
  27. }
  28.  
  29. tipo_Nodo *insertarPrimero (tipo_Nodo **lista, tipo_info elemento){
  30.    tipo_Nodo *p;
  31.    p = getNode(elemento);         /*obtiene un nuevo nodo*/
  32.    if (p != NULL)                 /*Si obtuvo un nodo (p)...*/
  33.       {
  34.        if (listaVacia (*lista))  /*Si lista vacia...*/
  35.           *lista = p;            /*actualiza "lista" con p*/
  36.        else                      /*sino*/
  37.           {
  38.            /*Enlaza p antes del primero ("lista")*/
  39.            p->next = *lista;    /*p apunta a "lista"*/
  40.            *lista = p;          /*actualiza "lista" con p*/
  41.           }
  42.       }
  43.    return p;     /*retorna el nuevo nodo creado*/
  44. }
  45.  
  46. void mostrarLista (tipo_Nodo *lista){
  47.    tipo_Nodo *p;
  48.    p = lista;               /*guarda primer nodo en p*/
  49.    while (p != NULL)        /*recorre la lista*/
  50.    {
  51.       printf("%d,%d,%f\n", p->info.DNI, p->info.Edad,
  52.              p->info.PromedioCalif);
  53.       p = p->next;               /*avanza nodo p*/
  54.    }
  55.    printf("\n");
  56. }
  57.  
  58. int eliminarNodo (tipo_Nodo **lista, tipo_Nodo *nodo){
  59.    tipo_Nodo *q;
  60.    if (nodo == NULL)              /*Si el nodo de entrada es NULL...*/
  61.       return (-1);                /*no puede eliminar*/
  62.    if (listaVacia (*lista))       /*Si lista vacia...*/
  63.       return (-1);                /*(underflow) retorna -1*/
  64.    else                           /*sino*/
  65.       {
  66.        if (nodo == *lista)       /*Si el nodo de entrada es el primero...*/
  67.           *lista = nodo->next;   /*actualiza "lista" con siguiente de nodo*/
  68.        else                      /*sino*/
  69.           {
  70.            q = *lista;             /*Buscar nodo (q) anterior a nodo*/
  71.            while (q->next != nodo)
  72.              q = q->next;
  73.            /*Enlaza (q) anterior a nodo con siguiente de nodo*/
  74.            q->next = nodo->next;   /*q apunta a siguiente de nodo*/
  75.           }
  76.        free (nodo);              /*libera nodo (memoria dinamica)*/
  77.        return (1);           /*retorna elemento eliminado*/
  78.       }
  79. }
  80.  
  81. tipo_Nodo *buscar (tipo_Nodo *lista, tipo_info elemento){
  82.    tipo_Nodo *p;
  83.    p = lista;                     /*guarda primer nodo en p*/
  84.    while (p != NULL)              /*recorre la lista*/
  85.    {
  86.      if (p->info.DNI, elemento.DNI)  /*Si elemento encontrado*/
  87.         return p;                /*retorna nodo p*/
  88.      else
  89.         p = p->next;             /*avanza nodo p*/
  90.    }
  91.    return NULL;                   /*Si no encontrado, retorna NULL*/
  92. }

Este es el archivo h:
Código C:
Ver original
  1. #ifndef ESTUDIANTE_H
  2. #define ESTUDIANTE_H
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. /*Definicion de Tipo para elementos*/
  9. typedef struct nodo_estudiante {
  10.     int DNI;
  11.     int Edad;
  12.     float PromedioCalif;
  13. } tipo_info;
  14.  
  15. /*Definicion de Tipo para una Lista*/
  16. typedef struct nodo_Lista {
  17.     tipo_info info;
  18.     struct    nodo_Lista *next;
  19. } tipo_Nodo;
  20.  
  21.  
  22. void nuevaLista (tipo_Nodo **lista);
  23.  
  24. tipo_Nodo *getNode (tipo_info elemento);
  25.  
  26. int listaVacia (tipo_Nodo *lista);
  27.  
  28. tipo_Nodo *insertarPrimero (tipo_Nodo **lista, tipo_info elemento);
  29.  
  30. void mostrarLista (tipo_Nodo *lista);
  31.  
  32. int eliminarNodo (tipo_Nodo **lista, tipo_Nodo *nodo);
  33.  
  34. tipo_Nodo *buscar (tipo_Nodo *lista, tipo_info elemento);
  35.  
  36. #endif

Muchas gracias :)