Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: falconez en 24 Enero 2014, 05:18 am



Título: Listas dobles, comparacion de un elemento con el siguiente
Publicado por: falconez en 24 Enero 2014, 05:18 am
Saludos, mi duda es acerca de como puedo comparar un elemento con el siguiente hasta el final de la lista doble! El problema radica en que por ejemplo tengo que contar cuantas materias diferentes tengo en mi lista. Necesito ir comparando elemento a elemento hasta el final de la lista.
PDTA. Materia es tipo string.


      int i=0; //Contador de nodos
       int j=1; //Contador de materias diferentes

while (current != head->left){
            current=current->right;
      
       cout<<"NODO --------> "<<j++<<endl<<endl;
       cout<<"MATERIA : "<<current->data.materia<<endl;
       cout<<"__________________________________"<<endl<<endl;
       if (current->data.materia==current->right->data.materia) //PROBLEMA
           cout<<i++<<endl;
      
getch();
        
}


Título: Re: Listas dobles, comparacion de un elemento con el siguiente
Publicado por: skapunky en 25 Enero 2014, 16:52 pm
Primero de todo, un consejo...no uses left o right, utiliza "anterior" y "siguiente" para guardar las posiciones de memória, queda mas claro.

Código
  1. struct Tlista{
  2. char materia[20];
  3. lista *siguiente;
  4. lista *anterior;
  5. } *inicio = 0, *elemento = 0;

(imagino que tu estructura sera algo similar a lo anterior)

Te doy una idea:

1º Opcion:

Crea un array de chars, mediante un while vas guardando el nombre de las materias recorriendo tu estructura mediante "head->left" que seria lo equivalente en mi estructura a "elemento->siguiente".

Cada vez que te situes a un nuevo elemento de la estructura, lo comparas con los nombres que guardes en el array de chars, si ya exíste no hagas nada, si no exíste lo guardas en el array.

Una vez finalizado el bucle que recorra todo el contenido de tu estructura, es decir: (head->left == 0) lo único que deberás hacer es contar cuantos elementos tienes en el array de chars.

Se me ocurre otra idea, que es ordenando por orden alfabético las materias utilizando la función strcmp() que devuelve 1 cuando dos cadenas son identicas, dicha forma ya no te la explico porque quizá es doble trabajo y te lias intentando realizar el orden alfabético.


Título: Re: Listas dobles, comparacion de un elemento con el siguiente
Publicado por: eferion en 30 Enero 2014, 13:17 pm
Si sacas a relucir la magia de C++ verás que hay una solución que es realmente sencilla.

C++ tiene varios tipos de contenedores: vector, map, multimap... cada uno tiene sus propias características, por lo que elegir el correcto en cada situación puede ahorrarnos bastante trabajo.

Uno de estos contenedores es set. set es como vector, con las siguientes peculiaridades:

* los elementos se almacenan ordenados
* no admite duplicados

Dicho esto, saber cuantos elementos diferentes tienes en la lista es tan "sencillo" como recorrer la lista e ir añadiendo los nombres de las materias en el set. Al finalizar, el método count te dirá cuantas materias diferentes hay en tu lista.

Para recorrer la lista se pueden dar dos casos ( y no concretas cual es el tuyo ):

* La lista es plana, tiene un inicio y un final.
* La lista es circular, por lo que no hay un item->left que sea nulo

Si la lista es plana tienes que posicionarte en el primer elemento de la lista y empezar a recorrer los elementos desde ese punto hasta que encuentres un item->left que sea nulo.

Si la lista es circular, tendrás que ir comparando cada puntero "left" con el que hayas tomado como referencia ( desde el que empiezas )... cuando sean iguales es que has recorrido toda la lista.