폭토
34
2018-12-06 23:55:07
1
103

[c,c++]Hash Table 구현중인데 삽입이 전혀 되지가 않습니다.



#include<iostream>

#include<string>

#include<fstream>

#define Max 100000

#define LOAD_FACTOR 20



using namespace std;



typedef struct dataRecord

{

	string key;

	int count;	

}dataType;



typedef struct nodeRecord

{

	int record_count;

	dataType Data;

	nodeRecord* next;

}Node;



class Hash

{

	public:

		int size;

		Node** table;

	public:	

		void menu();

		void Create(int tablesize);

		void Insert(const char* key);

		int strhashfunc(const char *key);

		Node* Search(const char *key);

		void Update(const char *key);

		void Delete(const char *key);

		void Delete_table(Node** oldtable);

		void Save(const char *filename);

		void Open(const char *filename);

		void Rehash(int newtablesize);

		void Display();

		int numtest(const char* key);

};

void Hash::Display()

{

	

	for (int i = 0; i < size; i++)

	{

		Node* temp = table[i]->next;

		cerr << "Table : " << i<<endl;

		while (temp) {

			cerr << temp->Data.key << " " << temp->Data.count << endl;

			temp = temp->next;

		}

	}

}

void Hash::Create(int tablesize)

{

	table = new Node*[tablesize]; //table 을 생성합니다. 포인터 주소를 담을수 있는



	if (table == NULL){

		cout << "Memory Allocation fail" << endl;

		return;

	}

	size = tablesize;

      //생성한 table들을 size에 맞게 할당해 줍니다.

	for (int i = 0; i < size; i++) {

		table[i] = new Node();

		table[i]->record_count = 0;

		table[i]->next = NULL;

	}

	cerr << "HashTable Create" << endl;

}

Node* Hash::Search(const char* key)

{

	int num = strhashfunc(key);

	Node* s_node = table[num]->next;



	if(!s_node){

		return NULL;

	}

	

	while (s_node) {

		if (s_node->Data.key == key) {

			cerr << "Search key : " << s_node->Data.key;

			return s_node;

		}

		s_node = s_node->next;

	}

	

	return NULL;

}

//만일 주어진 return 받은 num값이 없다면 새로운 노드를 추가해 주고 그게 아니면  테이블에 리스트를 추가해 줍니다.

void Hash::Update(const char* key)

{

        //문제가 여기서 생깁니다. 분명히 class 내부의 table을 선언해주고 
//table도 create 하는데는 아무 문제가 발생하지 않습니다. 
//그러나 Update 함수를 통해 각 데이터를 추가를 해주려 보니 똑같은 데이터 "aaa"가 두번 들어가면 
//두번째 들어가는 "aaa"는 이미 table[num]->next 값이 NULL이 아니니 if문에 안들어가야되는데 
//NULL이라고 판단하고 들어가 버립니다...

	

	int num = numtest(key);

	Node* s_node = table[num]->next;



	if (!s_node) {

		s_node = new Node();

		s_node->Data.key = key;

		s_node->Data.count = 1;

		s_node->next = NULL;

		return;

	}

	while (s_node) {

		if (s_node->Data.key == key) {

			cerr << "Search key : " << s_node->Data.key;

			s_node->Data.count++;

			break;

		}

		s_node = s_node->next;

	}

	//찾는 key 가 없을때

	s_node = new Node();

	s_node->Data.key = key;

	s_node->Data.count = 1;

	s_node->next = NULL;

}

//각 string 한글자씩 코드값을 합산해 return 해줍니다.

int Hash::numtest(const char* key)

{

	int len = strlen(key);

	int result=0;

	for (int i = 0; i < len; i++)

		result += key[i];

	return result;

}









int main(int argc,char *argv[])

{

	ifstream ifile;

	Hash hash;

	string key;

	int hashsize;



	//ifile.open(argv[1]);

	ifile.open("memo.txt");



	if (!ifile.is_open()) {

		cerr << "Text is error!" << endl;

		return 0;

	}

	else {		

		cerr << "Input hashsize"<<endl;

		cin >> hashsize;

		hash.Create(hashsize);

		while (ifile >> key) {

			char* word = new char[key.size() + 1];

			copy(key.begin(),key.end(), word);

			word[key.size()] = '\0';

			hash.Update(word);

		}

	}

	hash.Display();

	hash.Search("aaa");

}


0
0
  • 답변 1

  • 폭토
    34
    2018-12-07 00:31:21

    void Hash::Update(const char* key)

    {

    //int num = strhashfunc(key);

    int num = numtest(key);

    Node* first = table[num];

    Node* s_node = first->next;

    Node* node = new Node();

    node->Data.key = key;

    node->Data.count = 1;

    if (!s_node) {

    first->next = node;

    return;

    }

    while (s_node) {

    if (s_node->Data.key == key) {

    cerr << "Search key : " << s_node->Data.key<<endl;

    s_node->Data.count++;

    return;

    }

    s_node = s_node->next;

    }

    //찾는 key 가 없을때

    s_node = new Node();

    s_node->Data.key = key;

    s_node->Data.count = 1;

    s_node->next = NULL;

    }

    ===================================================

    Update 함수를 이렇게 변경하였더니 정상적으로 동작하였습니다.

    그런데 무슨 차이가 있는지 잘 모르겠네요....

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.