#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUCKETS 11
typedef struct {
char item[10];
int key;
}element;
element* ht[BUCKETS];
void p1();
unsigned int stringToInt(char *key);
int h(int k);
void insert(char *str);
element* search(int k, int* num);
int main() {
p1();
return 0;
}
void p1() {
for (int i = 0;i < BUCKETS;i++)
ht[i] = NULL;
FILE* f = fopen("input.txt", "r");
if (!f) {
fprintf(stderr, "file doesn't exist\n");
exit(EXIT_FAILURE);
}
char line[200];
fgets(line, sizeof(line), f);
printf(" input strings : %s\n\n", line);
char delimeter[5] = " ";
char* word = strtok(line, delimeter);
while (word) {
insert(word);
word = strtok(NULL, delimeter);
}
printf(" item key\n");
for (int i = 0; i < BUCKETS; i++) {
if(ht[i]->key)
printf("ht[%2d] : %8s%8d\n", i, ht[i]->item, ht[i]->key);
else printf("ht[%2d] :\n", i);
}
printf("\nstring to search >> ");
char string[10];
element* temp;
int num = 0;
scanf("%s", string);
temp = search(stringToInt(string), &num);
if (!temp) printf("it dosen't exist!\n");
else printf("item:%s, key: %d, the number of comparisons : %d\n", temp->item, temp->key, stringToInt(string));
}
unsigned int stringToInt(char *key) {
int number = 0;
while (*key)
number += *key++;
return number;
}
int h(int k) {
return k % BUCKETS;
}
void insert(char *str) {
int key = stringToInt(str);
int hk = h(key);
int i = hk;
while (ht[i])
i = h(++i);
strcpy(ht[i]->item, str);
ht[i]->key = key;
}
element* search(int k, int* num) {
int homeBucket, currentBucket;
homeBucket = h(k);
for (currentBucket = homeBucket; ht[currentBucket] && ht[currentBucket]->key != k;) {
currentBucket = (currentBucket + 1) % BUCKETS;
if (currentBucket == homeBucket)
return NULL;
*num++;
}
if (ht[currentBucket] && ht[currentBucket]->key == k)
return ht[homeBucket];
return NULL;
}
하다보니까 ht를 포인터배열로 정의해야할거같아서 바꿨는데 insert함수 strcpy에서 또
0x7B54E559(ucrtbased.dll)에(1.exe의) 처리되지 않은 예외가 있습니다. 0xC0000005: 0x00000000 위치를 기록하는 동안 액세스 위반이 발생했습니다..
이오류뜸씨발왜이래미치겟어..
변수 함수 네이밍 시발.. - dc Cpp
변수 이름은 대부분 코수가정햇음..
ht해시테이블인
p1함수에서 ht 모든요소를 다 NULL로 초기화 시켜놓곤 그 후 아무짓도 안했는데 갑자기 ht[i]->key를 참조한다? 띠용~ - dc Cpp
어디서말하는거야?
아 insert(word)에서 처리하나보네 전역변수 씨팔진짜 - dc Cpp
디버깅계속하면서했는데 오류있는건 insert함수안에있는 strcpy밖에없음
ht 각 요소마다 동적할당 해줘라 - dc Cpp
아 그거였네 ㅅㅂ진짜감사
코수가 누구냐? - dc Cpp
교..슈...
뚜까패도무죄 - dc Cpp