2017-03-22 11 views
1

私はreg noに基づいてハッシュテーブルを作成しています。挿入機能は正常に動作していますが、衝突の場合は検索と削除が機能しません。それは全く何もしていない。コンパイルエラーもありません。どんな助けもありがとう。リニアプロービングが衝突のために機能しない

int size=4; 
struct students 
{ 
    char name[50]; 
    int regno; 
    int age; 
    char city[50]; 
}stud[4]; 

void insertion() 
{ 
    int reg,k,i; 
    printf("\nenter the student details you want to insert:\n"); 
    printf("\nenter regno: "); 
    scanf("%d",&reg); 
    k=reg%size; 
    if (stud[k].regno==0) 
    { 
     stud[k].regno=reg; 
     printf("\nenter name: "); 
     scanf("%s",&stud[k].name); 
     printf("\nenter age: "); 
     scanf("%d",&stud[k].age); 
     printf("\nenter city: "); 
     scanf("%s",&stud[k].city); 
    } 

    else 
    { 
     for(i=k+1;i<size;i++) 
     { 
      if (stud[i].regno==0) 
      { 
       stud[i].regno=reg; 
       printf("\nenter name: "); 
       scanf("%s",&stud[i].name); 
       printf("\nenter age: "); 
       scanf("%d",&stud[i].age); 
       printf("\nenter city: "); 
       scanf("%s",&stud[i].city); 
       break; 
      } 
      else 
       for(i=0;i<k;i++) 
       { 
        if (stud[i].regno==0) 
        { 

         stud[i].regno=reg; 
         printf("\nenter name: "); 
         scanf("%s",&stud[i].name); 
         printf("\nenter age: "); 
         scanf("%d",&stud[i].age); 
         printf("\nenter city: "); 
         scanf("%s",&stud[i].city); 
         break; 
        } 

       } 

     } 

    } 
} 

void deletion() 
{ 
    int reg, k; 
    int f=0; 
    printf("\nenter the student reg no you want to delete"); 
    scanf("%d",&reg); 
    k=reg%size; 
    if(stud[k].regno==0) 
    { 
     printf("\nIt is empty"); 
    } 

    else if(stud[k].regno==reg) 
    { 
     printf("The removed student is %d",stud[k].regno); 
     stud[k].regno=0; 
     stud[k].name[0]='\0'; 
     stud[k].age=0; 
     stud[k].city[0]='\0'; 
     printf("\n\n"); 

    } 

    else 
    { 
     int i; 
     for (i=k+1;i<size;i++) 
     { 
      if(stud[k].regno==reg) 
      { 
       printf("The removed student is %d",stud[k].regno); 
       stud[k].regno=0; 
       stud[k].name[0]='\0'; 
       stud[k].age=0; 
       stud[k].city[0]='\0'; 
       printf("\n\n"); 
       f=1; 
       break; 
      } 

     } 

     for(i=0;i<k;i++) 
     { 
      if (stud[i].regno==reg) 
      { 
       printf("The removed student is %d",stud[k].regno); 
       stud[k].regno=0; 
       stud[k].name[0]='\0'; 
       stud[k].age=0; 
       stud[k].city[0]='\0'; 
       printf("\n\n"); 
       f=1; 
       break; 
      } 
     } 
    } 

    if (f==1) 
    { 
     printf("\nIt is not present"); 
    } 
} 


void search() 
{ 
    int reg, k; 
    int f=0; 
    printf("\nenter the student reg no you want to search"); 
    scanf("%d",&reg); 
    k=reg%size; 
    if(stud[k].regno==0) 
    { 
     printf("\nIt is empty"); 
    } 

    else if(stud[k].regno==reg) 
    { 
     printf("The student found is: \n"); 
     printf("\nreg no: %d",stud[k].regno); 
     printf("\nname: %s",stud[k].name); 
     printf("\nage: %d",stud[k].age); 
     printf("\ncity: %s",stud[k].city); 
     printf("\n\n"); 
    } 

    else 
    { 
     int i; 
     for (i=k+1;i<size;i++) 
     { 
      if(stud[k].regno==reg) 
      { 
       printf("The student found is: \n"); 
       printf("\nreg no: %d",stud[k].regno); 
       printf("\nname: %s",stud[k].name); 
       printf("\nage: %d",stud[k].age); 
       printf("\ncity: %s",stud[k].city); 
       printf("\n\n"); 
       f=1; 
       break; 
      } 
     } 

     for(i=0;i<k;i++) 
     { 
      if (stud[i].regno==reg) 
      { 
       printf("The student found is: \n"); 
       printf("\nreg no: %d",stud[k].regno); 
       printf("\nname: %s",stud[k].name); 
       printf("\nage: %d",stud[k].age); 
       printf("\ncity: %s",stud[k].city); 
       printf("\n\n"); 
       f=1; 
       break; 
      } 
     } 

     if (f==1) 
     { 
      printf("\nIt is not present"); 
     } 
    } 
} 

void display() 
{ 
    int i; 
    for(i=0;i<size;i++) 
    { 
     printf("\nreg no: %d",stud[i].regno); 
     printf("\nname: %s",stud[i].name); 
     printf("\nage: %d",stud[i].age); 
     printf("\ncity: %s",stud[i].city); 
     printf("\n\n"); 
    } 
} 

void main() 
{ 
    int i,c; 
    for(i=0;i<size;i++) 
    { 
     stud[i].regno=0; 
     stud[i].name[0]='\0'; 
     stud[i].age=0; 
     stud[i].city[0]='\0'; 
    } 

    do { 
     printf (" Enter 1 for insert \n"); 
     printf (" Enter 2 for deletion \n"); 
     printf (" Enter 3 for search \n"); 
     printf (" Enter 4 for display \n"); 
     scanf ("%d", &c); 
     switch(c) 
     { 
      case 1: insertion(); 
       break; 
      case 2: deletion(); 
       break; 
      case 3: search(); 
       break; 
      case 4: display(); 
     } 
    } while(c>0 && c<=4); 
} 
+0

私はあなたのforループを '挿入 'と呼ばれるその怪物に入れようとしたのか疑いがありますが、それはまさにあなたがやったことです。デュライターでの行編集の時代は長らく残っています。インデントし、適切にブレースしてください。 – WhozCraig

答えて

0

内部ループに問題があります。

 else 
      for(i=0;i<k;i++) 
      { 

i既に使用されているので、あなたは、新しい変数を使用する必要があります。

 else 
      for(int j=i+1;j<k;j++) 
      { 

このエラーは、多くの場所に存在しています。

あなたのコードは「圧縮」できると思います。私はif..else { for..if..else { for..ifを最初の空のエントリを検索するreg%sizeから始まる単一のループにすることができると信じています。それは洗練された解決策になるでしょう。

+0

質問では、私は構造を使ってそれをしなければならないと与えられました。 Incase reg%sizeは同じ値(これはcollisionと呼ばれます)を与えます。キー値(reg%size)を空の次の場所に移動し、そこに格納される詳細を設定します。私はあなたがそれが上書きされると言った理由を理解していません。構造体は情報を格納することができ、私は 'stud [4]'を使って4レコードを宣言しました。私はインデントして申し訳なく思っています。将来の質問のために覚えています:) – Ashrav

+0

あなたが説明するものはハッシングではありません。もちろん、構造体を使用しますが、それらをバケットのリンクリストに格納します。そして、リンクされたリスト自体は構造体です。もちろん、あなたの先生を満たすのに十分な構造体以上です! –

+0

私たちが教えていることによると、ハッシュテーブルを実装するには2つの方法があります。1)リンクリストの使用、2)配列の実装。私は私のコードで配列の実装を使用しようとしています。あなたの方法がはるかに良く聞こえることに同意しますが、私はこの問題をこのように解決するように求められています。このコードを修正する方法を教えてください。 – Ashrav

関連する問題