2016-12-18 17 views
1

衝突したキーのリンクに問題があります。最新のキーは、テーブルにリンクされた前のキーよりも優先されます。私は、衝突したキーがリンクされたリストに正しく保存されているかどうかを確認するために、衝突のためにコード化されていますが、正しく保存されていません。 コードに含まれる部分は次のとおりです。 while(tempHash!= NULL)ループ後にヌルにハッシュテーブル内の次への衝突キーのハッシュ

typedef struct student 
{ 
    char name[10]; 
    char sex[4]; 
    char number[12]; 
    char mail[50]; 
    bool filled; 
    struct student *next; 
}ST; 

void Readfromfile(ST *hashTable)//Read data from txt file and build hash table 
{ 
    FILE *ft; 
    ft = fopen("info.txt", "r"); 
    if(!ft) 
    { 
     printf("FAILED TO OPEN FILE\n"); 
     return; 
    } 
    char *buffer = malloc(sizeof(char)*43); 
    char cp_name[10], cp_sex[4], cp_num[12], cp_mail[50]; 
    int st_index =0, i; 
    while((fgets(buffer, sizeof(buffer)*50, ft)) != NULL) 
    { 
     if(strlen(buffer) != 0) 
      sscanf(buffer, "%s %s %s %s", cp_name, cp_sex, cp_num, cp_mail); 
     printf("READ: %s", buffer); 
     int hash_value = Hashfun(cp_num); 
     ST *current = malloc(sizeof(ST)); 
     strcpy(current->name, cp_name); 
     strcpy(current->sex, cp_sex); 
     strcpy(current->number, cp_num); 
     strcpy(current->mail, cp_mail); 
     current->filled = true; 
     current->next = NULL; 
     ST *tempHash = &hashTable[hash_value]; 
     if(tempHash->filled == true) 
     { 
      printf("THERE IS A COLLISION at %d SAVING AT NEXT \n\n\n",hash_value); 
      while(tempHash!= NULL) 
      { 
       printf("I AM PROBLEM HEREEEEEEEEEEEEEEEEEEEEEEE\n"); 
       printf("PASSING BY: %s %s %s %s at %d\n",tempHash->name,tempHash->sex, 
         tempHash->number,tempHash->mail, hash_value); 
       tempHash = tempHash->next; 
      } 
      tempHash = current; 
      printf("HASHED NEXT: %s %s %s %s at %d\n",tempHash->name,tempHash->sex, tempHash->number, 
        tempHash->mail, hash_value); 
     } 
     else 
     { 
      strcpy(tempHash->name, cp_name); 
      strcpy(tempHash->sex, cp_sex); 
      strcpy(tempHash->mail, cp_mail); 
      strcpy(tempHash->number, cp_num); 
      tempHash->filled = true; 
      tempHash->next = NULL; 
      printf("HASHED: %s %s %s %s at %d\n",tempHash->name,tempHash->sex,  tempHash->number, 
        tempHash->mail, hash_value); 
     } 
    } 
} 
+1

コードのインデントを適切に行うと、問題の詳細がわかります。 –

+0

問題は衝突を次のものにリンクしていました。以下の答えはそれを解決しました。そして、すべてがうまくインデントされ、ちょうどコピー中に台無しになった!しかし、ありがとう。 @ 200OK –

答えて

2
tempHash = current; 

tempHashポイント。

次の2つのオプション

まず

while(tempHash->next!= NULL) { 
    tempHash = tempHash->next; 
} 
tempHash->next = current; 

セカンド

代わりの最後にcurrent要素を追加することを持って、直接あなたのリンクリストの最初の要素として追加。

if(tempHash->filled == true) 
{ 
    current->next = tempHash; 
    hashTable[hash_value] = current; 
} 
+0

両方のオプションがうまくいきました、ありがとう@ cahit-gungor –