2011-12-28 6 views
-1

내가 체인 알고리즘에 의해 해시를 구현하는 아래의 코드를 프로그램,하지만 난 main 기능에서 사용할 때, 결과가 잘못 :잘못된 결과가

#define _SIZE 1000 

class HashEntry 
{ 
    public: int Tel; 
      string Name; 

    public: HashEntry(){} 
    public: HashEntry(int Tel, string Name) 
    { 
     this->Tel = Tel; 
     this->Name = Name; 
    } 
}; 

class Link { 
    public: 
    HashEntry data; 
     Link *next; 

    public: 
     Link() : next(NULL){ } 

}; 

void Insert (Link *head, HashEntry data) 
{ 
    Link *t= new Link; 
    t->data=data; 

    if(head==NULL) 
    { 
     head = new Link; 
     head->next = NULL; 
     head->data = data; 
     return; 
    } 

    Link *head2= head; 
    while(head2->next!=NULL) 
    {  
     if(head2->data.Name == data.Name) 
      return; 
     head2=head2->next; 
    } 

    head2->next=t; 
} 

class HashTable { 
    public: 
    Link **a; 
    public: 
    HashTable() 
     { 
      a = new Link *[_SIZE]; 
      for (int i=0; i<_SIZE; i++) 
       a[i]=NULL; 
     } 

    public: 
     int HashFonction (string key) 
     { 
      int res=0; 
      for (int i = 0; i < key.length(); i ++) 
      { 
       char ch = key.at(i); 
       if(i%2==0) 
        res+=(int)ch; 
       else 
        res-=(int)ch; 
      } 

      return (int)fabsf((float)res) % _SIZE; 
     } 

     void HashInsert (string key, int val){ 
      int index= HashFonction(key); 
      HashEntry s(val, key); 
      Insert(a[index],s); 
     }  

     int HashSearch(string key) 
     { 
      int inx=HashFonction(key); 
      Link *head=a[inx]; 

      if(head==NULL){ 
       return -1; 
      } 

      while(head!=NULL){ 
       if(head->data.Name==key) 
        return head->data.Tel; 

       head=head->next; 
      } 

      return -1; 
     } 
}; 

이 후,이 클래스를 구현하고, 나는 다음과 같은 코드를 프로그램 그러나 검색 결과는 -1입니다. -/

HashTable ht; 
ht.HashInsert("Hossein", 849348); 
ht.HashInsert("Ali", 94343); 
ht.HashInsert("Fatemeh", 940343); 

cout << ht.HashSearch("Ali") << endl; // output = -1 :-/ 

아무 설명이 잘못 되었습니까? 귀하의 관심

감사

+1

코드를 디버그하여 정확히 어디에서 오류가 발생했는지 확인하십시오. 삽입 단계에서? [그렇다면 - 어디에서?] 검색에서? [검색에 실패한 이유는 무엇입니까?] – amit

+0

나는 그것이 옳다고 생각합니다! -/ –

+1

당신은 디버거를 사용해야한다 [또는 IDE에 디버거가 없다면 printf를 사용하고] 모든 삽입이 올바르게 완료되었는지 먼저 확인해야한다. 그렇지 않다면 - 정확히 * 실패한 곳을 조사한 다음 찾아 계속 이동하여 같은 방식으로 확인하십시오. – amit

답변

1

값에 의한 삽입 기능에 포인터 머리를 전달하므로 해시 테이블의 배열 "a"가 변경되지 않습니다. 참조로 전달하면 다음과 같이 문제가 해결됩니다.

void Insert (Link *&head, HashEntry data) 
+0

고맙습니다. :) 내 문제를 해결했습니다 :) 고마워요. –

2

당신의 문제는

기본적으로
void Insert (Link *& head, HashEntry data) 

void Insert (Link * head, HashEntry data) 

변경이 포인터는 값에 의해 전달되는 것입니다

당신이 양을하려고 무엇

void Bar(Link* input) 
{ 
    input = new Link(); 
} 

Link* foo = 0; 
Bar(foo); 

막대가 foo 을 반환 한 후에도 여전히 0이됩니다. 포인터를 값으로 전달하면 포인터가 아닌 포인터의 내용을 수정할 수 있습니다. 당신이 참조로 포인터로

대안 1

패스

void Bar(Link*& input) 
{ 
    input = new Link(); 
} 

Link* foo = 0; 
Bar(foo); 

대안이

가에 대한 포인터를 전달할 수 있습니다 의도 한대로 위의 물건 작동하게하려면 포인터

void Bar(Link** input) 
{ 
    *input = new Link(); 
} 

Link* foo = 0; 
Bar(&foo); 
+0

고맙습니다. :) 내 문제를 해결했습니다 :) 고마워요. –

관련 문제