Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/07/2013, 08:14
Avatar de LydiaH
LydiaH
 
Fecha de Ingreso: julio-2013
Ubicación: Ávila, España
Mensajes: 15
Antigüedad: 11 años, 4 meses
Puntos: 0
Pregunta Números aleatorios y listas enlazadas

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:

Código C:
Ver original
  1. void CreaListaAleatoria(NODO**);

En la definición de tipos he definido NODO tipo de estructura de la siguiente manera:

Código C:
Ver original
  1. typedef struct nodo
  2. {
  3.    int num;
  4.    struct nodo *sig;
  5. }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
  1. /*Esta función añade a la lista enlazada nodos cuyo valor de num es un número
  2. aleatorio. Los añade a la lista de forma ordenada*
  3.  
  4. void CreaListaAleatoria (NODO** lista)
  5. {
  6.    //Declaración de variables
  7.    NODO*nuevo;
  8.    NODO*indice;
  9.    NODO*anterior;
  10.    int num_aleatorio=0;
  11.  
  12.    anterior=NULL;
  13.    indice=*lista; //Con indice recorreremos la lista enlazada
  14.    
  15.    /*Obtenemos un número aleatorio en función del reloj del ordenador*/
  16.    srand (time(0));  
  17.    num_aleatorio = rand ()% RANGO;
  18.  
  19.  /*Asignación de memoria dinámica para el nuevo nodo.*/
  20.    nuevo = (NODO*) malloc (sizeof(NODO));
  21.    
  22.   /*Asignación de num_aleatorios al campo 'num' del nodo nuevo*/
  23.    nuevo->num = num_aleatorio;
  24.    
  25.   /*Si la lista está vacia, insertamos el nodo como primero de la lista*/
  26.    if(indice==NULL)
  27.    {
  28.       *lista=nuevo;
  29.        nuevo->sig=NULL;
  30.    }
  31.    
  32.    else
  33.    {
  34.      /*Recorremos la lista hasta encontrar un nodo con un número mayor al que
  35.      queremos insertar, o bien hasta llegar al final de la lista*/
  36.      while((indice->num < num_aleatorio)&&(indice->sig!=NULL))
  37.      {
  38.        anterior=indice;
  39.        indice=indice->sig;
  40.      }
  41.      
  42.   /*Si el indice apunta a NULL significa que no hay ningún nodo con un número
  43.     mayor y que por lo tanto se añadirá al finalizar la lista*/
  44.     if((indice->sig==NULL)&&(indice->num<num_aleatorio))
  45.      {
  46.        nuevo->sig=NULL;
  47.        indice->sig=nuevo;
  48.      }
  49.    
  50.    /*Si anterior apunta a NULL entonces el nodo se inserta como primero de la
  51.     lista*/
  52.     else if(anterior==NULL)
  53.     {
  54.       nuevo->sig=*lista;
  55.       *lista=nuevo;
  56.     }
  57.    
  58.     /*Sino, el nodo se inserta en mitad de la lista en el lugar que le corresponda*/
  59.  
  60.     else
  61.     {
  62.       nuevo->sig=indice;
  63.       anterior->sig=nuevo;
  64.     }
  65.   }
  66. }

(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!