Hash-Tabelle für die Implementierung in C++
Ich versuche den folgenden code für die Hash-Tabelle Implementierung in C++. Das Programm kompiliert und Eingaben akzeptiert und dann eine popup-Meldung angezeigt: "das Projekt hat aufgehört zu arbeiten und windows ist die Suche nach einer Lösung für das problem. Ich fühle mich das Programm in die Endlosschleife irgendwo. Kann jemand vor Ort die Fehler???? Bitte um Hilfe!!
#include <iostream>
#include <stdlib.h>
#include <string>
#include <sstream>
using namespace std;
/* Definitions as shown */
typedef struct CellType* Position;
typedef int ElementType;
struct CellType{
ElementType value;
Position next;
};
/* *** Implements a List ADT with necessary functions.
You may make use of these functions (need not use all) to implement your HashTable ADT */
class List{
private:
Position listHead;
int count;
public:
//Initializes the number of nodes in the list
void setCount(int num){
count = num;
}
//Creates an empty list
void makeEmptyList(){
listHead = new CellType;
listHead->next = NULL;
}
//Inserts an element after Position p
int insertList(ElementType data, Position p){
Position temp;
temp = p->next;
p->next = new CellType;
p->next->next = temp;
p->next->value = data;
return ++count;
}
//Returns pointer to the last node
Position end(){
Position p;
p = listHead;
while (p->next != NULL){
p = p->next;
}
return p;
}
//Returns number of elements in the list
int getCount(){
return count;
}
};
class HashTable{
private:
List bucket[10];
int bucketIndex;
int numElemBucket;
Position posInsert;
string collision;
bool reportCol; //Helps to print a NO for no collisions
public:
HashTable(){ //constructor
int i;
for (i=0;i<10;i++){
bucket[i].setCount(0);
}
collision = "";
reportCol = false;
}
int insert(int data){
bucketIndex=data%10;
int col;
if(posInsert->next==NULL)
bucket[bucketIndex].insertList(data,posInsert);
else { while(posInsert->next != NULL){
posInsert=posInsert->next;
}
bucket[bucketIndex].insertList(data,posInsert);
reportCol=true;}
if (reportCol==true) col=1;
else col=0;
numElemBucket++;
return col ;
/*code to insert data into
hash table and report collision*/
}
void listCollision(int pos){
cout<< "("<< pos<< "," << bucketIndex << "," << numElemBucket << ")"; /*codeto generate a properly formatted
string to report multiple collisions*/
}
void printCollision();
};
int main(){
HashTable ht;
int i, data;
for (i=0;i<10;i++){
cin>>data;
int abc= ht.insert(data);
if(abc==1){
ht.listCollision(i);/* code to call insert function of HashTable ADT and if there is a collision, use listCollision to generate the list of collisions*/
}
//Prints the concatenated collision list
ht.printCollision();
}}
void HashTable::printCollision(){
if (reportCol == false)
cout <<"NO";
else
cout<<collision;
}
Die Ausgabe des Programms ist der Punkt, wo es zu einer Kollision in der hash-Tabelle, thecorresponding-bucket-Nummer und die Anzahl der Elemente im bucket.
vielleicht sollten Sie einige Debuggen und sehen, welche Schleife es klemmt? Es klingt wie Sie mithilfe von visual studio, was bedeutet, können Sie einfach Schritt für Schritt durch den code, bis er hängenbleibt...
Du hast
Du hast
10
bestreut im gesamten code hier. Sollte das nicht sein, zumindest eine Konstante? Auch ist es generell eine gute Idee, eine Primzahl, wie Ihre Eimer Größe.InformationsquelleAutor user3340866 | 2014-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach dem Versuch dubbuging, ich komme zu wissen, dass, während den Aufruf eines Konstruktors sind Sie nicht die Entleerung des
bucket[bucketIndex]
.Also Ihr Hash-Tabelle Konstruktor sollte wie folgt:
InformationsquelleAutor preetam
was Sie tun können, ist, die Sie bekommen können posInsert mit
Eimer[bucketIndex].Ende()
so, dass posInsert-> ist definiert
und es gibt keine Notwendigkeit,
while(posInsert->next != NULL){
posInsert=posInsert->next;
da end() Funktion wird genau das tun, so verwenden Sie die end () - Funktion
InformationsquelleAutor Kshitiz