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#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*/
p
= (tipo_Nodo
*) malloc(sizeof(tipo_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*/
{
printf("%d,%d,%f\n", p
->info.
DNI, p
->info.
Edad, 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*/
}
free (nodo
); /*libera nodo (memoria dinamica)*/ 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 :)