Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хеш таблица 
:(
    Опции темы
vovamakr
Дата 24.11.2015, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 2.11.2015

Репутация: нет
Всего: нет



Нужна помощь в реализации хеш таблице
Я  хочу вывести на екран свою хеш таблицу
Код

void Print(const HashTable* hashTable)
{
    for (HashTable::BucketNode* listNode = hashTable->buckets; listNode != nullptr; listNode = listNode->nextNode) // тут выдает ошибку.  
        printf("%d\n", listNode->value);
    printf("\n");
}

Мой хедер файл:
Код

#ifndef __HASHTABLE_H__
#define __HASHTABLE_H__

struct String;

struct HashTable
{
    struct BucketNode
    {
        String* key;
        int value;
        BucketNode* nextNode;
    };
    BucketNode** buckets;
    unsigned maxNumBuckets;
    unsigned numElements;
};

(есть еще и  другии функции)
const int* Get(const HashTable* hashTable, const char* key);
void Remove(HashTable* hashTable, const char* key);
void Print(const HashTable* hashTable);

#endif


Добавлено @ 12:51
Тоже самое и в функциях Get(), Remove();
Код

const int* Get(const HashTable* hashTable, const char* key)
{
    for (HashTable::BucketNode* listNode = hashTable->buckets; listNode != nullptr; listNode = listNode->nextNode)
    {
        if (strcmp(listNode->key->str, key) == 0)
            return listNode;
    }
    return nullptr;
}
void Remove(HashTable* hashTable, const char* key)
{
    HashTable::BucketNode* temp = hashTable->buckets;
    hashTable->buckets = temp->nextNode;
    free(temp);
}


Это сообщение отредактировал(а) vovamakr - 24.11.2015, 12:56
PM MAIL   Вверх
vovamakr
Дата 24.11.2015, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 2.11.2015

Репутация: нет
Всего: нет



Print переделал: 
Код

void Print(const HashTable* hashTable)
{
    for (int bucketIndex = 0; bucketIndex < hashTable->maxNumBuckets; ++bucketIndex)
    {
        HashTable::BucketNode*& headNode = hashTable->buckets[bucketIndex];
        for (HashTable::BucketNode* listNode = headNode; listNode != nullptr; listNode = listNode->nextNode)
            printf("%d\n", listNode->value);
    }
}

а от Remove не правильно работает(
Код

void Remove(HashTable* hashTable, const char* key)
{
    for (int bucketIndex = 0; bucketIndex < hashTable->maxNumBuckets; ++bucketIndex)
    {
        HashTable::BucketNode*& headNode = hashTable->buckets[bucketIndex];
        for (HashTable::BucketNode* listNode = headNode; listNode != nullptr; listNode = listNode->nextNode)
        {
            HashTable::BucketNode* temp = listNode;
            if (strcmp(listNode->key->str, key) == 0)
            {
                listNode = temp->nextNode;
                free(temp);
                return;
            }
        }
    }



Это сообщение отредактировал(а) vovamakr - 24.11.2015, 15:30
PM MAIL   Вверх
Sajtran
Дата 25.11.2015, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 15.10.2008
Где: Мегион

Репутация: нет
Всего: 2



в чём проблема то?
и чем из STL реализация не устраивает?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
volatile
Дата 25.11.2015, 12:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(vovamakr @  24.11.2015,  12:41 Найти цитируемый пост)
  for (HashTable::BucketNode* listNode = hashTable->buckets; listNode != nullptr; listNode = listNode->nextNode)
    {
        if (strcmp(listNode->key->str, key) == 0)

зачем вообще хеш, если тупо искать линейным поиском?


Это сообщение отредактировал(а) volatile - 25.11.2015, 12:38
PM MAIL   Вверх
math64
Дата 25.11.2015, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Я уже объяснял ТС, в другой темее, как должна реализовываться хеш-таблица:
http://forum.vingrad.ru/index.php?showtopi...t&p=2649741
хеш-код можно считать например так:
Код

int HashCode(Node* node)
  int hash = node->hash;
  if (hash == 0)
    const char* s = node->key;
    while(*s)
      hash = hash * 31 + *s++;
    node->hash = hash;
  }
  return hash;  
}

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0724 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.