2017-03-22 36 views
1

我正在根據註冊號進行哈希表。插入功能工作正常,但搜索和刪除不起作用的情況下發生衝突。它根本沒有做任何事情。也沒有任何編譯錯誤。任何幫助,將不勝感激。線性探測不適用於碰撞

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循環嵌入到名爲'insertion'的怪物中,但這正是你所做的,這樣做,你循環'i'。在decwriter上進行行編輯的日子早已不復存在。縮進,並正確支撐你的代碼。 – 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給出了相同的值(我稱之爲碰撞),我希望鍵值(reg%size)轉移到下一個空白位置並將細節存儲在那裏。我不明白你爲什麼說會覆蓋。結構可以存儲信息,並且我使用'stud [4]聲明瞭4條記錄'我對縮進感到抱歉,我是編程新手。請記住將來的問題:) – Ashrav

+0

你描述的不是哈希。當然你使用結構,但是你將它們存儲在桶的鏈表中。而且鏈表本身就是一個結構,當然,結構足以滿足你的老師! –

+0

根據我們所教導的,有兩種方法來實現散列表1)使用鏈表,2)數組實現。我想在我的代碼中使用數組實現。我同意你的方法聽起來好多了,但我被要求用這種方法解決這個問題。你能告訴我如何解決這個問題嗎? – Ashrav