Hola, buenas tardes!
Traigo una duda al foro, con el fin de poder encontra a alguien que me ayude. Acabo de terminar primero de ingeniería informática, el problema es el siguiente:
Estoy realizando un programa en C que hace uso de las listas enlazadas, funciones y números aleatorios. El objetivo del programa es realizar una lista enlazada con números aleatorios. Cada vez que el usuario solicite "añadir un nuevo nodo" se debe incluir un nuevo nodo a la lista enlazada que incluye a su vez un número aleatorio. También se deben colocar ordenados (al ser añadidos) en la lista enlazada aunque este no es el problema.
Mi problema es que he realizado una función con el siguiente prototipo:
En la definición de tipos he definido NODO tipo de estructura de la siguiente manera:
Código C:
Ver originaltypedef struct nodo
{
int num;
struct nodo *sig;
}NODO;
He declarado una lista enlazada NODO*lista; y la he inicializado para poder usarla
lista=NULL;
El desarrollo de la función es el siguiente:
Código C:
Ver original/*Esta función añade a la lista enlazada nodos cuyo valor de num es un número
aleatorio. Los añade a la lista de forma ordenada*
void CreaListaAleatoria (NODO** lista)
{
//Declaración de variables
NODO*nuevo;
NODO*indice;
NODO*anterior;
int num_aleatorio=0;
anterior=NULL;
indice=*lista; //Con indice recorreremos la lista enlazada
/*Obtenemos un número aleatorio en función del reloj del ordenador*/
num_aleatorio
= rand ()% RANGO
;
/*Asignación de memoria dinámica para el nuevo nodo.*/
nuevo
= (NODO
*) malloc (sizeof(NODO
));
/*Asignación de num_aleatorios al campo 'num' del nodo nuevo*/
nuevo->num = num_aleatorio;
/*Si la lista está vacia, insertamos el nodo como primero de la lista*/
if(indice==NULL)
{
*lista=nuevo;
nuevo->sig=NULL;
}
else
{
/*Recorremos la lista hasta encontrar un nodo con un número mayor al que
queremos insertar, o bien hasta llegar al final de la lista*/
while((indice->num < num_aleatorio)&&(indice->sig!=NULL))
{
anterior=indice;
indice=indice->sig;
}
/*Si el indice apunta a NULL significa que no hay ningún nodo con un número
mayor y que por lo tanto se añadirá al finalizar la lista*/
if((indice->sig==NULL)&&(indice->num<num_aleatorio))
{
nuevo->sig=NULL;
indice->sig=nuevo;
}
/*Si anterior apunta a NULL entonces el nodo se inserta como primero de la
lista*/
else if(anterior==NULL)
{
nuevo->sig=*lista;
*lista=nuevo;
}
/*Sino, el nodo se inserta en mitad de la lista en el lugar que le corresponda*/
else
{
nuevo->sig=indice;
anterior->sig=nuevo;
}
}
}
(Espero que se entienda, es la primera vez que publico un fragmento de código en un foro)
La función a la hora de ordenar funciona bien. El problema es que a la hora de añadir nuevos nodos, los números aleatorios se repiten, es decir, se genera un número aleatorio y se repite continuamente en todos los nodos. Supongo que es porque al ser operaciones que se realizan en muy poco tiempo no se modifica el reloj del ordenador y no se generan números nuevos aleatorios. No se como solucionarlo, seguramente se puede crear este programa utilizando otras funciones con otros argumentos, no me exigen que sea así, pero a mi me gustaría saber si existe algún modo de resolverlo sin tener alterar todo el código del programa.
Muchas gracias!!! Un saludo!