#include <stdio.h>
#include <stdlib.h>
typedef struct rNodo {
int dato;
struct rNodo * siguiente;
} tNodo;
typedef struct rLista {
tNodo * primero;
tNodo * ultimo;
int longitud;
} tLista;
typedef tNodo * Nodo;
typedef tLista * Lista;
tLista* inicializar();
tNodo* crear_nodo(int nuevo_dato);
void ins_de_orden_ascen(Lista lista, Nodo nuevo_nodo);
void mostrar(Lista lista);
void liberar(Lista lista);
int main(void) {
Lista lista = inicializar();
int nuevo_dato;
int continuar; // cambio el nombre de variable para hacerlo más coherente. No lo inicializo ya que en el bucle se debe hacer obligatoriamente.
do {
printf("ingrese un numero: "); scanf("%i", &nuevo_dato
); ins_de_orden_ascen(lista, crear_nodo(nuevo_dato));
printf("Quiere ingresar otro numero? 1(si) o 0(no): "); } while (continuar);
mostrar(lista);
liberar(lista);
return 0;
}
tLista* inicializar() { // no tiene razón la existencia de un argumento, no se usaba
Lista nueva_lista
= malloc(sizeof (tLista
)); nueva_lista->primero = NULL;
nueva_lista->ultimo = NULL;
nueva_lista->longitud = 0;
return nueva_lista;
}
tNodo* crear_nodo(int nuevo_dato) {
Nodo nuevo_elemento
= malloc(sizeof (tNodo
)); nuevo_elemento->dato = nuevo_dato;
nuevo_elemento->siguiente = NULL;
return nuevo_elemento;
}
void ins_de_orden_ascen(Lista lista, Nodo nuevo_nodo) { // no tiene razón que se devuelva la lista, no se modifica su puntero
if (lista->longitud == 0) { // Si la lista es vacia
nuevo_nodo->siguiente = lista->primero;
lista->primero = nuevo_nodo;
lista->ultimo = nuevo_nodo;
} else {
Nodo aux = lista->primero; // aux apunta al primer elemento
Nodo ant = NULL;
while(aux && aux->dato < nuevo_nodo->dato) { // busco el nodo con un dato mayor al nuevo dato, también puede llegar al fin de la lista
ant = aux; // y me quedo con el nodo anterior
aux = aux->siguiente;
}
if(ant) { // si el nodo anterior existe
ant->siguiente = nuevo_nodo; // hago que su siguiente apunte al nuevo nodo
if(lista->ultimo == ant) { // si el nodo anterior era el último de la lista
lista->ultimo = nuevo_nodo; // ahora debe serlo el nuevo nodo
}
} else {
lista->primero = nuevo_nodo; // en caso contrario quiere decir que el nuevo nodo debe ser el primero
}
nuevo_nodo->siguiente = aux; // el siguiente del nodo nuevo debe ser el nodo que debía ser el siguiente, o NULL si había llegado al final de la lista
}
lista->longitud++; // Aumenta la cantidad de elementos
}
void mostrar(Lista lista) { // pinta la lista en pantalla
if(!lista) { // No existe lista
printf("Lista no inicializada"); return;
}
if(lista->longitud == 0) { // Lista vacía
return;
}
for(Nodo n = lista->primero; n; n = n->siguiente) { // Muestra todos los nodos
}
}
void liberar(Lista lista) { // Desaloja la lista de la memoria
Nodo sig;
if(!lista) { // Si no existe lista no hay que liberar nada
return;
}
while(lista->primero) {
sig = lista->primero->siguiente;
lista->primero = sig;
// lista->longitud--; // No hace falta esta línea ya que la lista se va a desalojar de la memoria
}
}