Advertisement
Guest User

Untitled

a guest
Oct 25th, 2013
1,308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. #define PRIME_SIZE 29 // Не говорящее имя переменной, HASH_TABLE_DEF_SIZE куда лучше
  5.  
  6. using namespace std;
  7.  
  8. class Person // Класс, который содержит немного информации о человеке.
  9. {
  10. public:
  11.     Person *next; // Нарушение инкапсуляции, атрибуты класса в общем лучае не должны быть public
  12.     string name;
  13.     string surname;
  14.     int age;
  15.  
  16.     Person() // Нет инициализации атрибутов (age и next) по умолчанию в этом конструкторе
  17.     {
  18.         this->next = NULL;
  19.     }
  20.  
  21.     //Person (string name, string surname, int age = 0)
  22.     Person (string name_, string surname_, int age_ = 0) : name(name), surname(surname), age(age_), next(NULL) // лучше так, почему лучше гуглите
  23.     {
  24.         this->name = name; // это удалить, инициализация уже была проведена в списке инициализации
  25.         this->surname = surname;
  26.         this->age = age;
  27.         this->next = NULL;
  28.     }
  29.  
  30.     ~Person()
  31.     {
  32.         //cout << "Delete " << this->name << endl; // из финального кода такие комментарии должны быть убраны
  33.         if ( this->next != NULL ) // удаление нулевого указателя валидно, потому вместо такой проверки лучше убедитесь что он был проинициализирован в конструкторе
  34.         {
  35.             delete this->next;
  36.         }
  37.     }
  38. };
  39.  
  40. // контейнер нужно сделать шаблонным
  41. class HashTable // Хеш-таблица, представленная в виде массива элементов (которые в свою очередь представляют список).
  42. {
  43.     Person *table[PRIME_SIZE]; // использование "голого массива". или замените на вектор, или используйте std::array
  44.  
  45.     // вообще наличие комментариев говорит о том, что код не очень хорош. хороший код можно прочитать и без комментариев
  46.     // потому лучше постарайтесь написать понятный код, чем полупонятный с объясняющими комментариями.
  47.  
  48.     // Самая простоя хеш-функция. Считает сумму ASCII кодов, делит на константу и
  49.     // получает остаток от деления.
  50.  
  51.     // зачем эта функция сделана статической? почему не обойтись простой функцией?
  52.     static int hash ( string str )
  53.     {
  54.         int asciisum = 0;
  55.         for ( int i = 0; i < str.length(); i++ ) // этот циакл можно заменить на std::accumulate
  56.         {
  57.             asciisum += str[i];
  58.         }
  59.         return asciisum % PRIME_SIZE;
  60.     }
  61.  
  62. public:
  63.  
  64.     HashTable()
  65.     {
  66.         // а что если PRIME_SIZE будет отрицательный?
  67.         // при обоходе по индексу лучше использовать size_t, а не int. подробней си. на viva64
  68.         for ( int i = 0; i < PRIME_SIZE; i++ )
  69.         {
  70.             table[i] = NULL;
  71.         }
  72.     }
  73.  
  74.     ~HashTable()
  75.     {
  76.         //cout << "Delete table\n";
  77.         for ( int i = 0; i < PRIME_SIZE; i++ )
  78.         {
  79.             delete table[i];
  80.         }
  81.     }
  82.  
  83.     // Вставляет элемент в таблицу
  84.     void push ( string name, string surname, int age ) // лучше название "insert"
  85.     {
  86.         int hashNumber = hash(name); // переменные которые не меняются, должны быть описаны как const
  87.         Person *pers = new Person(name, surname, age);
  88.         Person *place = table[hashNumber];
  89.         if ( place == NULL )
  90.         {
  91.             table[hashNumber] = pers;
  92.             return;
  93.         }
  94.  
  95.         while ( place->next != NULL )
  96.         {
  97.             place = place->next;
  98.         }
  99.         place->next = pers;
  100.     }
  101.  
  102.     // Получает элемент из таблицы по его имени.
  103.     Person* find ( string name )
  104.     {
  105.         int hashNumber = hash ( name );
  106.         Person *result = table[hashNumber];
  107.         if ( !result )
  108.         {
  109.             // очень плохо, в классах контейнерах не должно быть никаких cout,
  110.             // это не задача класса выводить что-то.
  111.             // а если этот код будет использоваться в оконном приложении, там cout будет доступен?
  112.             cout << "Element not found" << endl;
  113.             return NULL;
  114.         }
  115.         while ( result->name != name )
  116.         {
  117.             if ( !result->next )
  118.             {
  119.                 cout << "Element not found" << endl;
  120.                 break;
  121.             }
  122.             result = result->next;
  123.         }
  124.         return result;
  125.     }
  126. };
  127.  
  128. int main()
  129. {
  130.     HashTable newTable;
  131.     newTable.push("Artyom", "Devyatov", 20);
  132.     newTable.push("Vasya", "Petrov", 23);
  133.     newTable.push("Ilja", "Saveljev", 28);
  134.     newTable.push("Ilaj", "Savanna", 43); // Имеет коллизию с Ilja
  135.     newTable.push("Dmitry", "Kuzychev", 31);
  136.  
  137.     Person * search = newTable.find("Ilaj");
  138.     if ( search )
  139.     {
  140.         cout << search->surname << endl;
  141.     }
  142.  
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement