Ir ao conteúdo

Ajuda com hashing em C


gustavoarcanjo

Posts recomendados

Postado

Preciso de ajuda com esse programa, o debugger indica erro na linha 102, aparentemente não estou conseguindo fazer com que current->prox seja igual a NULL em imprimeHD e não sei o porquê. Agradeço quem puder ajudar.


#include<ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Lista lista;
struct Lista {
char Palavra[20];
int indice[10];
int n;
lista* prox;
};


void add_hash(lista **pInicio, lista* novo){


if(pInicio==NULL){
return ;
}else if(strlen(novo->Palavra)>0){
novo->prox = *pInicio;
*pInicio = novo;

}
}
int calculaChave(char* P){

int i;
int soma=0;
for(i=0;i<strlen(P);i++){
soma+=P[i];

}

return soma%11;
}
lista* lerII(FILE* fp){


char P[20]="",num;
int n[10];
int i,j;
lista *novo;


i=0;
fscanf(fp,"%c",&num);/*le o \n*/
printf("1num=%d\n",num);

do{
fscanf(fp,"%c",&P[i]);
if(P[i]==0) return NULL;
printf("1P[%d]=%d",i,P[i]);
i++;
}while(P[i-1]!=' ');

P[i-1]=(char)0;/*vai ser um espaço*/
P[i-2]=(char)0;/*vai ser um \t*/

if(strlen(P)<8){
P[i-3]=(char)0;/*vai ser um \t*/
}
j=0;

do{
fscanf(fp,"%d",&n[j]);/*armazena a numero em n[j]*/
fscanf(fp,"%c",&num);/*le espaço ou \n*/

printf("\nn[%d]=%d\n",j,n[j]);

j++;
}while(num==' ');
//getchar();
n[j]=-1;

novo = (lista*)malloc(sizeof(lista));
novo->prox=NULL;
strcpy(novo->Palavra,P);

for(j=0;n[j]!=-1;j++){
novo->indice[j]=n[j];
}
novo->n=j;


return novo;

}
void imprimeHD(FILE *fp,lista *hash[11]){
int chave=0,j;
char linha[20];
char num;
lista *current;
if(hash==NULL){
fprintf(fp,"O inicio é vazio.");
}

fprintf(fp,"Palavra\t\tChave\tIndice");/*imprime no HD a palavra a chave e o indice*/
for(chave=0;chave<11;chave++){
current=hash[chave];
while(current!=NULL){
if(strlen(current->Palavra)>0 && current->Palavra!=NULL)
fprintf(fp,"%s\t",current->Palavra);
printf("%s\t",current->Palavra);
if(strlen(current->Palavra)<8){
fprintf(fp,"\t");
printf("\t");
}
fprintf(fp,"%d\t",chave);
printf("%d\t",chave);

for(j=0;j<current->n;j++){
printf(" %d",current->indice[j]);
fprintf(fp," %d",current->indice[j]);
}
printf("\n\n");
fprintf(fp,"\n\n");
current=current->prox;

}
}
}

int main(){
FILE* HD,*II;
lista * hash[11];
lista *atual;
char linha[20],num;
int chave;


if((HD = fopen("HashDocs.txt","w"))==NULL){
printf("Erro na abertura do arquivo");
exit (1);
}
if((II = fopen("IndInvert.txt","r"))==NULL){
printf("Erro na abertura do arquivo");
exit (1);
}
fscanf(II,"%[^\n]",linha);

do{
atual=lerII(II);/*ler uma linha*/
if(atual!=NULL){
chave=calculaChave(atual->Palavra);/*calcula a chave da palavra*/
add_hash(&hash[chave],atual);/*adiciona a nova palavra ao vetor hash*/
}

printf("Palavra=%s\n",hash[chave]->Palavra);
printf("chave=%d\n",chave);
}while(!feof(II));

imprimeHD(HD,hash);

fclose(II);
fclose(HD);

return 0;

}


Edit: acabei de resolver setando o hash em null

...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!