2016-01-30 2 views
1

У меня проблема с сортировкой моего Hashtable. У меня есть методы для сравнения чисел, букв и алгоритма сортировки пузырьков. Вывод сортировки не является моим желаемым, потому что он печатает хеш-таблицу с помощью вставки-заказа (сначала вставлен - сначала напечатан), и то, что я хочу, сортирует по клавише в порядке возрастания или по значению также возрастает. Ключи - это целые числа, а значения - это строки. Вот код:Сортировка Hashtable с использованием сортировки пузыря C++

#include<iostream> 
#include<string> 

using namespace std; 
const int size = 100; 

class Binding 
{ 
    public: 
     int key; 
     string value; 
     Binding *next; 

     Binding(int key, string value) 
     { 
      this->key = key; 
      this->value = value; 
      this->next = NULL; 
     } 
}; 

class HashTable 
{ 
    private: 
     Binding** tarray; 

    public: 
     HashTable() 
     { 
      array = new Binding*[size]; 
      for(int i = 0; i < size; i++) 
      {     
       array[i] = NULL; 
      } 
     } 

     int insert(int key, string value)   
     { 
      int hash = (key % size); 
      Binding *record = array[hash]; 
      Binding *previous = NULL; 

      if(record != NULL) 
      { 
       previous = record; 
       record = record->next; 
      } 
      else if(record == NULL) 
      { 
       record = new Binding(key, value); 

       if (previous == NULL) 
       { 
        array[hash] = record; 
       } 
       else 
       { 
        previous->next = record; 
       } 
      } 
      else 
      { 
       record->value = value; 
      } 
     } 

     int compareLetters(const void *a, const void *b) 
     { 
      Binding *A = (Binding*)a; 
      Binding* B = (Binding*)b; 
      int compare = strcmp(A->letter, B->letter); 

      if(compare == 0) 
        return 0; 
      else if(compare > 0) 
       return 1; 
      else if(compare < 0) 
       return -1; 
     } 

     int compareNumbers(const void *a, const void *b) 
     { 
      Binding *A = (Binding*)a; 
      Binding *B = (Binding*)b; 
      if(A->key > B->key) 
       return 1; 
      else if(A->key < B->key) 
       return -1; 
      else 
       return 0; 
     } 

     void bubble_sort() 
     { 
      Binding *temp; 
      for(int i=1; i<size; i++) 
      { 
       for(int j=0; j<size - i; j++) 
       { 
        if(compareNumbers(&array[j], &array[j+1]) == 1) 
        { 
         temp = array[j]; 
         array[j] = array[j+1]; 
         array[j+1] = temp; 
        } 
       } 
      } 
     } 
+0

'if (record! = NULL)' '{...}' 'else if (запись == NULL)' '{...}' 'else' является просто исчерпывающей и неправильной конструкцией. –

+0

Пожалуйста, не удаляйте вопрос и не публикуйте его повторно; отредактируйте свой вопрос, чтобы добавить дополнительные детали, если это необходимо. –

+0

'int compareNumbers (const void * a, const void * b)' Прекратить использование 'void *'. Используйте фактические типы ('Binding *'). – PaulMcKenzie

ответ

2

Берет адрес Binding указателей и передать их compareNumbers функцию в этой строке:

   if(compareNumbers(&array[j], &array[j+1]) == 1) 

Это неправильно, потому что compareNumbers функция excepts значениями конвертируются в Binding * в качестве аргументов, не Binding **, как вы передаете их сейчас.

+2

И вам не нужно объявлять параметры 'compareNumbers' как' void * '; если вы использовали правильные типы и сбросили бесполезные броски, компилятор сказал бы вам о проблеме. –

Смежные вопросы