Listas adyacentes

Lo que pasa es que estoy programando listas adyacentes, más bien un diccionario, el programa me lee un archivo .txt y busca iniciales y después las palabras, pero no se como recorrer el puntero *ady, aquí esta la estructura:
struct node
{ char letra;
char pal[15];
int c;
struct node *sig,*ady;
};
typedef struct node nodo;
typedef nodo *tipolista;
esta es la funcion para buscar
int buscapal(tipolista lista,char ini,char palab[15])
{ int b=1,i=0;
while(lista!=NULL)
{ if(ini==lista->letra)
while(lista!=NULL)
{
while(palab!='\0'&&b!=0)
{ if(palab==lista->pal)
b=0;
i++;}
if(b==0)
{lista->c=lista->c+1;
}
lista=lista->ady;}
lista=lista->sig;}
return b;
}

El problema es que me guarda todas las palabras (no se tienen que repetir) y se cicla en la función anterior

1 respuesta

Respuesta
1
Trata de reparar los posibles errores de ejecución.
De hecho, al igual que despues que invocas un whiles abres y cierras con llaves todo lo ke kieres ke se ejecute repetitivamente. tienes que hacer lo mismo con los if
aki abres un if pero no defines lo que quieres que se ejecute si se cumple la condicion
esta es la funcion para buscar
int buscapal(tipolista lista,char ini,char palab[15])
{ int b=1,i=0;
while(lista!=NULL)
{ if(ini==lista->letra)  <------   aqui, es importante abrir y cerrar las llaves hasta donde                                                     kieres ke se ejecute, por que le siguen varias lineas
                                                de codigo, hasta hay whiles anidados.
while(lista!=NULL)
{
while(palab!='\0'&&b!=0)
{ if(palab==lista->pal)
b=0;                             <-----------  igual aqui, segun este if, solo encierra al b=0
                                                      no se si eso es lo unico ke debe hacer este if
i++;}
if(b==0)
{lista->c=lista->c+1;
}
lista=lista->ady;}
lista=lista->sig;}
return b;
}
Bueno eso es solo para ver más claro el código
ahora te pregunto, ¿el i++ para que esta? ¿Para qué sirve esa variable? no veo que le des uso
También veo que tu encuentras la palabra, ahora buscas aquellas que tienen adyacentes de esa palabra, pero y de pronto aparece esta comparación palab! ='\0' esto que significa exactamente? ¿Diferente a que?, y si la palabra viene con un valor, que supongo es una PALABRA EN SI, ¿por qué tendría que ser igual a ese código?
lo que si supongo es que estas haciendo una comparacion de los caracteres. mmmm pero la idea de esa comparacion está errada por que te falta poner los indices
asi 
while(palab !='\0'&&b!=0)
{ if(palab==lista->pal)
b=0;
i++;}

ahora si le vería sentido a tu i++
Pero ahora que tu i tiene un valor de letras coincidentes, ¿qué vas a hacer con ese i? ¿No lo tendrías que comparar con el numero de letras que tiene tu palabra?


En ese caso como también supongo que b es bandera, entonces cuando b=0 es por que la palabra es igual a la palabra de tu lista. ¿Entonces cuándo será pal igual a palab? Cuando i sea igual a un numero de letras que posee tu palabra, podría ser pues un atributo de tu nodo, un atributo int letras


Entonces tu while para que tnga esa reacción, de poner b=0 cuando la palabra fue encontrada sería
coincidencias =0;
i=0;    <--- tienes que inicializar el i = 0 cada vez que compares cada palabra de la lista.

while(palab !='\0')
{ if(palab==lista->pal)
    {Coincidencias++;} <--- este sería una nueva variable para contar las coincidencias te las letras

i++;
}
Una vez terminado el whiles de la comparación letra por letra hagamos que bandera sea igual a 0 si encontramos la palabra
if(coincidencias == letras){
b=0;
y aki terminamos al fin la busqueda
entonces hacemos lista==NULL para terminar por completo los while

}

Esto no lo entiendo bien por que no se que significa la variable c
if(b==0)
{lista->c=lista->c+1;
}



y ten cuidado con un ERROR!
si estas saliendo del while interno
while(lista!=NULL)
{
while(palab!='\0'&&b!=0)
{ if(palab==lista->pal)
b=0;
i++;}
if(b==0)
{lista->c=lista->c+1;
}
lista=lista->ady;}
es por que lista = NULL
entonces al salir de aki te encuentras con la siguiente sentencia inmediatamente
lista=lista->sig;
Esto el programa lo analizará en algun momento como
lista = NULL entonces NULL ->sig? Esto es un error
es posible que el programa tenga un problema de asignación y tu bucle del primer while se pueda volver infinito (LO MISMO ME PASABA A VECES)
Eso es todo, si algo no te queda claro con mis modificaciones pásame la voz, cuidate mucho y disculpa si escribí mucho je je, me gusta ser específico para que no haya dudas.
Gracias por la ayuda, me revolví al principio, pero acabe entendiendo xD
¿El \0 es lo que indica final de la cadena no?, es lo que hago, que me compare letra por letra y hasta, c es el contador de cuantas veces aparece una palabra en el texto
i inicializa cada que se realiza la función, pero es correcto lo que dices, edebo de ponerlo antes de que se realice esa parte
intentare terminar ese programa, solo por que se que lo puedo hacer y quiero aprender a programar como se debe, pero unos días después, ya que me dejaron otro más difícil
Muchas gracias por tu respuesta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas