2014-04-07 88 views
1

我正在嘗試C++中哈希表實現的以下代碼。程序編譯並接受輸入,然後出現一個彈出窗口,提示「項目已停止工作,Windows正在檢查問題的解決方案,我覺得程序正在某個地方的無限循環中,任何人都可以發現錯誤。 !C++中的哈希表實現

#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; 
     } 

程序的輸出是那裏是在哈希表的碰撞,thecorresponding桶數目,並在該區塊的元素數量的點。

+1

也許你應該做一些調試,看看哪個循環它卡在?這聽起來像你正在使用Visual Studio,這意味着你可以通過你的代碼,直到它卡住... –

+0

你已經''10'撒在你的代碼在這裏。難道這不是最起碼的常數嗎?此外,使用素數作爲您的存儲桶大小通常是一個好主意。 – tadman

回答

0

你可以做的是,你可以得到pos插入使用
存儲桶[bucketIndex] .end()

,使得posInsert->被定義爲
並且不需要
而(posInsert-> next!= NULL){
posInsert = posInsert-> next;

,因爲最終()函數正是這樣做的所以使用end()函數

2

試圖dubbuging後,我才知道,雖然調用構造函數,你不排空bucket[bucketIndex]

所以你的哈希表的構造函數應該是如下:

HashTable(){ //constructor 
      int i; 
      for (i=0;i<10;i++){ 
       bucket[i].setCount(0); 
       bucket[i].makeEmptyList(); //here we clear for first use 
      } 
      collision = ""; 
      reportCol = false; 

     } 

//Creates an empty list 
void makeEmptyList(){ 
     listHead = new CellType; 
     listHead->next = NULL; 
    }