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
#include <stdio.h> #include <stdlib.h> #include "Estudiante.h" void nuevaLista (tipo_Nodo **lista){ *lista = NULL; } tipo_Nodo *getNode (tipo_info elemento){ tipo_Nodo *p; /*Asigna memoria dinamicamente para un solo nodo*/ if (p != NULL) /*Si obtuvo un nodo (p) de la memoria...*/ { p->info = elemento; /*guarda elemento en info*/ p->next = NULL; /*next apunta a NULL*/ } return p; } int listaVacia (tipo_Nodo *lista){ if (lista == NULL) return (1); /*retorna 1 (Exito). Lista vacia*/ else return (0); /*retorna 0 (Error). Lista no vacia*/ } tipo_Nodo *insertarPrimero (tipo_Nodo **lista, tipo_info elemento){ tipo_Nodo *p; p = getNode(elemento); /*obtiene un nuevo nodo*/ if (p != NULL) /*Si obtuvo un nodo (p)...*/ { if (listaVacia (*lista)) /*Si lista vacia...*/ *lista = p; /*actualiza "lista" con p*/ else /*sino*/ { /*Enlaza p antes del primero ("lista")*/ p->next = *lista; /*p apunta a "lista"*/ *lista = p; /*actualiza "lista" con p*/ } } return p; /*retorna el nuevo nodo creado*/ } void mostrarLista (tipo_Nodo *lista){ tipo_Nodo *p; p = lista; /*guarda primer nodo en p*/ while (p != NULL) /*recorre la lista*/ { p->info.PromedioCalif); p = p->next; /*avanza nodo p*/ } } int eliminarNodo (tipo_Nodo **lista, tipo_Nodo *nodo){ tipo_Nodo *q; if (nodo == NULL) /*Si el nodo de entrada es NULL...*/ return (-1); /*no puede eliminar*/ if (listaVacia (*lista)) /*Si lista vacia...*/ return (-1); /*(underflow) retorna -1*/ else /*sino*/ { if (nodo == *lista) /*Si el nodo de entrada es el primero...*/ *lista = nodo->next; /*actualiza "lista" con siguiente de nodo*/ else /*sino*/ { q = *lista; /*Buscar nodo (q) anterior a nodo*/ while (q->next != nodo) q = q->next; /*Enlaza (q) anterior a nodo con siguiente de nodo*/ q->next = nodo->next; /*q apunta a siguiente de nodo*/ } return (1); /*retorna elemento eliminado*/ } } tipo_Nodo *buscar (tipo_Nodo *lista, tipo_info elemento){ tipo_Nodo *p; p = lista; /*guarda primer nodo en p*/ while (p != NULL) /*recorre la lista*/ { if (p->info.DNI, elemento.DNI) /*Si elemento encontrado*/ return p; /*retorna nodo p*/ else p = p->next; /*avanza nodo p*/ } return NULL; /*Si no encontrado, retorna NULL*/ }
Este es el archivo h:
Código C:
Ver original
#ifndef ESTUDIANTE_H #define ESTUDIANTE_H #include <stdio.h> #include <stdlib.h> /*Definicion de Tipo para elementos*/ typedef struct nodo_estudiante { int DNI; int Edad; float PromedioCalif; } tipo_info; /*Definicion de Tipo para una Lista*/ typedef struct nodo_Lista { tipo_info info; struct nodo_Lista *next; } tipo_Nodo; void nuevaLista (tipo_Nodo **lista); tipo_Nodo *getNode (tipo_info elemento); int listaVacia (tipo_Nodo *lista); tipo_Nodo *insertarPrimero (tipo_Nodo **lista, tipo_info elemento); void mostrarLista (tipo_Nodo *lista); int eliminarNodo (tipo_Nodo **lista, tipo_Nodo *nodo); tipo_Nodo *buscar (tipo_Nodo *lista, tipo_info elemento); #endif
Muchas gracias :)