| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
manuellopera11
Registrado: 02 Abr 2010 Mensajes: 2
| Publicado: 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: 7516 Ubicación: Mexico
| Publicado: 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:
* 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |