2017-05-15 1 views
0

J'essaye d'implémenter la table de hachage avec la résolution séparée de collision de chaînage et j'ai un problème. Ceci est mon code (peu modifié pour simplifier, mais encore une erreur même):Le programme C++ se termine sans raison? (Table de hachage)

#define _CRT_SECURE_NO_WARNINGS 
#include <iostream> 
#include <fstream> 
#include <cstring> 
#include <string> 
using namespace std; 

int ascii(char character) 
{ 
    return character; 
} 

int hashFunction(string word, int num) 
{ 
    char* str = new char[word.length() + 1]; 
    strcpy(str, word.c_str()); 
    return ((3 * ascii(str[0]) + 5 * ascii(str[1]))) % num; 
} 

typedef struct tab 
{ 
    string data; 
    struct tab* next; 
}Node; 

typedef struct link 
{ 
    Node* head; 
    Node* tail; 
}List; 

List* createList() 
{ 
    List* list = new List(); 
    if (list) 
    { 
     list->head = NULL; 
     list->tail = NULL; 
    } 
    return list; 
} 

void insert(List* list, string data) 
{ 
    //if list is empty 
    if (list->head == NULL) //!!!!!!!!!!!!!!!!ERROR OCCURE HERE !!!!!!!!!!!!!!! 
    { 
     list->head = new Node(); 
     list->head->data = data; 
     list->head->next = NULL; 
     list->tail = list->head; 
    } 
    //if list already contains some data 
    else 
    { 
     list->tail->next = new Node(); 
     list->tail->next->data = data; 
     list->tail = list->tail->next; 
     list->tail->next = NULL; 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    int size = 8; //Size of hash table (number of indexes) 

    List* table[12]; 

    string A[8] = {  "hello","world","car","notebook","science","starwars","lollypop","anything" }; 

//Insert elements from array A into a hash table 
int index; 
for (int i = 0; i < size; i++) 
{ 
    index = hashFunction(A[i], size); 
    if (table[index] == NULL) 
     table[index] = createList(); 
    insert(table[index], A[i]); 
} 

return 0; 
} 

Quand je lance le fichier .exe (ou commence à partir cmd), programme se termine avec un message que app.exe a cessé de fonctionner . J'ai essayé de déboguer le programme et j'ai obtenu ceci: http://imgur.com/a/yOhRV

Quelqu'un peut-il m'aider à résoudre ce problème? J'ai compris que le problème doit être dans la fonction insert(), probablement dans la condition, mais je ne sais pas ce qui ne va pas.

+2

Bienvenue dans Stack Overflow! Il semble que vous deviez apprendre à utiliser un [débogueur] (https://en.wikipedia.org/wiki/Debugger) pour parcourir votre code. Avec un bon débogueur, vous pouvez exécuter votre programme ligne par ligne et voir où il dévie de ce que vous attendez. C'est un outil essentiel si vous voulez faire de la programmation. Pour en savoir plus: [Comment déboguer de petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

Répondre

3

vous derefernce un pointeur sans le vérifier: if (list->head == NULL) ...

ce que vous faites ici, prend list et cheking si la valeur est pointée par ce NULL, mais puisque vous n'avez pas vérifié if (list) il est possible que list == NULL et qui provoque segfault lors de la déréférencement

1

Vous déclarez List* table[12] mais il n'est jamais initialisé. Donc, il contient des déchets. Pour effectuer l'initialisation, vous devez effectuer les opérations suivantes: List* table[12] = {NULL};

0

En règle générale, vous ne devriez jamais avoir de variables non initialisées dans votre code (sauf à des fins d'optimisation lorsque vous savez exactement ce que vous faites).

Ajoutez les opérateurs par défaut à vos structures et utilisez la liste d'initialisation. Gardez aussi les variables aussi locales que possible (déplacez l'index dans la boucle).

Vous n'avez pas besoin d'ascii() parce que char est un type entier. char + char et char * int sont promus int.