Dúvida na utilização de strings [RESOLVIDO]

1. Dúvida na utilização de strings [RESOLVIDO]

Marcos
marcos@marcos

(usa Ubuntu)

Enviado em 08/11/2012 - 07:01h

Caros colegas, preciso fazer um algoritmo (inicialmente de forma simples) que identifique sequencias iguais de palavras dados 2 textos. Esses textos devem ser carregados para listas duplamente encadeadas, depois comparadas e devo manter apenas a maior sequencia encontrada numa outra lista.

Fiz tenho já os 2 textos em arquivos diferentes, faço a abertura dos fluxos de dados para esse textos e os carrego para o algoritmo, até aqui está tranquilo. Abaixo começo a postar partes do código.

Utilizo a seguinte estrutura:

struct TipoCelula{
char Palavra[101];
TipoCelula *Esq, *Dir;
};


Funções que armazenam dados na lista:

bool Lista_Inserir_Inicio(char *Elemento, int numLista){
TipoCelula *Novo; int i=0,tamanho;
if((Novo = (TipoCelula *) malloc(sizeof(TipoCelula)))==NULL){
return false;
}
else{
strcat(Elemento,"{TTEXTO}");
while(Elemento[i]!='{TTEXTO}'){
Novo->Palavra[i]=Elemento[i];
i++;
}
Novo->Dir = Frente[numLista];
Novo->Esq = NULL;

if(Lista_Vazia(numLista))
Tras[numLista]= Novo;
else
Frente[numLista]->Esq = Novo;

Frente[numLista]= Novo;
Contador[numLista]++;
return true;
}
}

bool Lista_Inserir_Fim(char *Elemento, int numLista){
TipoCelula *Novo; int i=0;
if((Novo = (TipoCelula *) malloc(sizeof(TipoCelula)))==NULL){
return false;
}
else{
strcat(Elemento,"{TTEXTO}");
while(Elemento[i]!='{TTEXTO}'){
Novo->Palavra[i]=Elemento[i];
i++;
}
Novo->Dir = NULL;
Novo->Esq = Tras[numLista];
if(Lista_Vazia(numLista))
Frente[numLista]= Novo;
else Tras[numLista]->Dir = Novo;

Tras[numLista]= Novo;
Contador[numLista]++;
return true;
}
}


Fazendo o carregamento do texto e passando para a lista

while(!feof(arq1)){
função
fscanf(arq1,"%s",str);


if(k==0){
Lista_Inserir_Inicio(str,0);
k++;//isso garante com que esse if seja executado apenas na primeira iteração do programa
}
else
Lista_Inserir_Fim(str,0);
}
fclose(arq1);


Até aqui tudo acontece sem nenhuma mensagem de erro.
Mas quando imprimo a lista depois dessa sequencia está sendo impresso junto lixo de memória. Como posso resolver?


  


2. Re: Dúvida na utilização de strings [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/11/2012 - 18:11h

Novamente o software que implementa o fórum trocou todas as ocorrências de "\0" por "{TEXTO}". Mas dá para entender o programa.

Permita-me fazer comentários no corpo do seu código (colocando tudo em maiúsucla para dar destque visual).

marcos@marcos escreveu:

(...)

Funções que armazenam dados na lista:

bool Lista_Inserir_Inicio(char *Elemento, int numLista){
TipoCelula *Novo; int i=0,tamanho;
if((Novo = (TipoCelula *) malloc(sizeof(TipoCelula)))==NULL){
return false;
}
else{
strcat(Elemento,"{TEXTO}"); /* <--- ISTO AQUI NÃO TEM SERVENTIA ALGUMA. REMOVA. */
/* TODO O BLOCO while ABAIXO PODE SER TROCADO POR ``strcpy(Novo->Palavra, Elemento);''. */
while(Elemento[i]!='{TEXTO}'){
Novo->Palavra[i]=Elemento[i];
i++;
}
Novo->Dir = Frente[numLista];
Novo->Esq = NULL;

if(Lista_Vazia(numLista))
Tras[numLista]= Novo;
else
Frente[numLista]->Esq = Novo;

Frente[numLista]= Novo;
Contador[numLista]++;
return true;
}
}

bool Lista_Inserir_Fim(char *Elemento, int numLista){
/* Aplicam-se os mesmos comentários da função acima. */
/* (...) */
}


Fazendo o carregamento do texto e passando para a lista

/* EU TROCARIA O "while(!feof(...)){ fscanf(...)" POR
"while( fscanf(arq1, "%s", str)==1 ) {"
*/
while(!feof(arq1)){
fscanf(arq1,"%s",str);


if(k==0){
Lista_Inserir_Inicio(str,0);
k++;//isso garante com que esse if seja executado apenas na primeira iteração do programa
/* E, NUMA LISTA _VAZIA_, QUAL A DIFERENÇA ENTRE INSERIR NO INÍCIO OU NO FINAL? */
}
else
Lista_Inserir_Fim(str,0);
}
fclose(arq1);




3. Re: Dúvida na utilização de strings [RESOLVIDO]

Marcos
marcos@marcos

(usa Ubuntu)

Enviado em 08/11/2012 - 19:17h

Pensei que talvez o problema esteja na função que estou utilizando para a impressão.

void imprimeLista(int numLista){
TipoCelula *temp=Frente[numLista];
if(!Lista_Vazia(numLista)){
while(temp->Dir!=NULL){
printf("\npalavara: %s",temp->Palavra);
temp=temp->Dir;
}
}
}





4. Re: Dúvida na utilização de strings [RESOLVIDO]

Marcos
marcos@marcos

(usa Ubuntu)

Enviado em 08/11/2012 - 23:29h

Obrigado pelas sugestões Paulo1205!

Consegui resolver o problema apenas zerando a string antes de receber uma nova palavra. Abaixo o código:


bool Lista_Inserir_Fim(char *Elemento, int numLista){
TipoCelula *Novo;
if((Novo = (TipoCelula *) malloc(sizeof(TipoCelula)))==NULL){
return false;
}
else{
Novo->Palavra[0]='{TEXTO}';//seta a variável para evitar que fique lixo de memória
strcpy(Novo->Palavra,Elemento);
Novo->Dir = NULL;
Novo->Esq = Tras[numLista];
if(Lista_Vazia(numLista))
Frente[numLista]= Novo;
else Tras[numLista]->Dir = Novo;

Tras[numLista]= Novo;
Contador[numLista]++;
return true;
}
}


obs: apenas relembrando, onde se lê '{texto}' leia-se 'barra zero'.


5. Re: Dúvida na utilização de strings [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 09/11/2012 - 08:36h

"obs: apenas relembrando, onde se lê '{texto}' leia-se 'barra zero'."

Ok... é bom lembrar que a tag ( code ) é focado em shell script, então para evitar erro de código C utilizar ( http://codepad.org ) e anviar o link .

pessoalmente prefiro usar o codepad por ser bem mais rápido para atualuzar a página que na maioria das vezes visualizo direto no SmartPhone.


6. Re: Dúvida na utilização de strings [RESOLVIDO]

Marcos
marcos@marcos

(usa Ubuntu)

Enviado em 10/11/2012 - 20:45h

marcos@marcos escreveu:

Pensei que talvez o problema esteja na função que estou utilizando para a impressão.

void imprimeLista(int numLista){
TipoCelula *temp=Frente[numLista];
if(!Lista_Vazia(numLista)){
while(temp->Dir!=NULL){//OLHA O PROBLEMA AQUI!!!
//o correto é
while(temp!=NULL){
printf("\npalavara: %s",temp->Palavra);
temp=temp->Dir;
}
}
}




Não havia problema nas outras funções. Agora não me perguntem como não vi isso antes!







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts