너무 자주와서 민망하긴한데 ㅜ
해쉬테이블을 만들어 보려고 하는데요..
일단 해쉬테이블의 메모리 크기(해쉬테이블의 배열크기) 는 상관이 없다고 가정하고요.
파일을 읽으면서 단어가 같으면 카운터를 증가하고 아닐경우 해쉬테이블안에 아무렇게나 집어 넣으면됩니다.
(일단 비교자체만 안하고 메모리가 충분한 해쉬테이블에 넣으면됨)
일단 저는 해쉬짤줄몰라서...
텍스트 파일의 단어를 atoi해서 정수값으로 바꾸고 그 정수값을 해쉬테이블크기만큼 %해서 해쉬테이블에 넣으려고 하거든요!!
여기서 첫번째 질문!!
int number=atoi(string); 을 하면
number는 그냥 정수값이 아닌가요?? number % 해쉬테이블크기를 해서 넣고 싶은데..
number정수값이 바뀌질 않아요 ㅜㅜ 무슨 개념인가요? number 에 - 1 이런식으로 정수값을 해봐도 수학연산이랑은 안맞게 연산이 되더라구요 ㅜ
제가 만들어본건데 솔직히 제가 봐도 웃기지만..
왜 안되는지 문제점좀 지적해주시면 감사하겠습니다.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_wordS 200000
typedef struct tagWORD_COUNT
{
char word_key[20]; // 최대20 자까지의단어
int count;
} WORD_COUNT;
WORD_COUNT word[MAX_wordS];
// 최대단어의수
//해쉬테이블 초기화 과정 각 버켓을들 공백으로 만드는것
///여기서 문자열 탐색키이므로 탐색키의 첫번쨰가 문자가 널이면 버켓이 비어있는것
void init_table(WORD_COUNT word[])
{
for(int i=0; i<MAX_wordS; i++)
{
word[i].word_key[0]=NULL;
}
}
void Addword_key(WORD_COUNT word_keys[],int *size, char* token);
void Showword_key(WORD_COUNT word_keys[]);
int main()
{
int count = 0;
char str[20];
FILE* file = fopen("a.txt", "rt");
if ( file == NULL )
{
printf("file open error!\n");
return 1;
}
init_table( word); //해쉬테이블 초기화
fscanf(file, "%s", str);
int number=atoi(str) ;
strcpy(word[number].word_key, str);
while ( !feof(file) )
{
//단어하나추가(단어가추가될경우count 가1 증가됨)
Addword_key(word,&count, str);
// 다음단어읽기
fscanf(file, "%s", str);
}
// 파일을닫음
fclose(file);
// 결과를출력
printf("결과:\n");
Showword_key(word);
return 0;
}
void Showword_key(WORD_COUNT word_keys[])
{
for ( int i = 0; i <MAX_wordS ; ++i )
{
if(!word_keys[i].count) //카운트값이 0이 면 지나감
continue;
//카운트값이 0이상이면
else
printf("%s(%d)\n", word_keys[i].word_key, word_keys[i].count);
}
}
void Addword_key(WORD_COUNT word_keys[],int *size, char* token)
{
int number=atoi(token) ; //읽어온 문자열을 숫자로 바꾼다.
//테이블에있는 word_key값이 널이 아니거나 읽어온 token과 값이 같으면 word count 를 하나 증가시킨다.
if(word[number].word_key != NULL && strcmp(word[number].word_key,token)==0 )
{
++word[number].count;
return ;
}
else //word_key값이 널이 거나 읽어온 문자열과 같지 않으면 해당테이블에 복사
{
strcpy(word[number].word_key, token);
word[number].count = 1;
}
}
해쉬테이블은 짤줄 모르고.
그냥 제가 할수있는 것 까지만 해보려고 합니다 도와주시면 정말정말 감사할것같습니다!