/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

algoritmo para eliminar palabras repetidas de una lista

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
manuellopera11



Registrado: 02 Abr 2010
Mensajes: 2

MensajePublicado: 04/06/2011 10:54 am
Título: algoritmo para eliminar palabras repetidas de una lista

Hola a todos,
queria saber como se puede borrar elementos repetidos en una lista enlazada, cuando llamo a la lista la deja igual, dejo lo que he pensado:

int EliminarRepetidos (struct lista**cabeza){

struct lista*aux=NULL;
struct lista*aux2=NULL;
struct lista*aux3=NULL;

aux = *cabeza;
aux3= *cabeza;

if (aux!=NULL){


aux2=aux2->sig;

/*Compara palabras*/
if (strcmp(aux->word,aux2->word) != 0){

aux = aux->sig;
aux2 = aux2->sig;

}else if (strcmp(aux->word,aux2->word) == 0)
{
if (aux == *cabeza) /*si esta situado en la cabeza*/
{
*cabeza = aux->sig;
free(aux);
}
else
{
aux3=aux2->sig; /*Si son iguales*/
aux->sig=aux3;
free (aux2);

}


EliminaRepetidos (&((aux)->sig)); /*llamo de forma recursiva*/

}
}
}

Gracias, y un saludo.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7520
Ubicación: Mexico

MensajePublicado: 04/06/2011 1:26 pm
Título:

Por lo visto la lista de palabras esta ordenada.

La función esta mal.

* El valor inicial de "aux2" es NULL así que no puedes aplicar indireccion con:
Código:
aux2 = aux2->sig;


* Tampoco verificas si la lista tiene un solo elemento, si es asi el primer uso de strcmp fallaría ya que se trataría de acceder a un puntero nulo y ahí el programa debe reventar.

* El segundo uso de strcmp no es necesario ya que esta implícito en la primera condición (en ella verificas si es distinto de cero).

* La función debería declararse con un valor de retorno de tipo "void".

Y ya que se trata de eliminar repetidos eliminando las siguientes instancias de la palabra no necesitas de un doble puntero.

Una forma iterativa de eliminar los duplicados seria mas o menos así:
Código:
void EliminarRepetidos(struct lista *p)
{
   struct lista *aux;
   
   while (p != NULL && p->sig != NULL)
      if (strcmp(p->word, p->sig->word) == 0){
         aux = p->sig;
         p->sig = p->sig->sig;
         free(aux);
      }else
         p = p->sig;
}


Parece correcta pero, para estar seguros, se tiene que revisar junto con el programa completo.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
manuellopera11



Registrado: 02 Abr 2010
Mensajes: 2

MensajePublicado: 05/06/2011 12:45 pm
Título:

Muchas gracias rir3760, lo he implementado con lo poco que se de listas, estoy aprendiendo de forma autodidacta y cuesta la verdad. El código funciona, no sabia que se podia hacer estas asignaciones:

p->sig->sig;

gracias de nuevo por las aclaraciones a tener en cuenta. Sigo practicando. Un saludo.
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com