2017-03-15 25 views
-3

以下是完整的代碼。如果在插入元素時主要運行循環少於30次,它就會運行。否則它不會。程序崩潰並給出錯誤「超出在線編譯器的時間限制」。我想看看插入到數組列表中的所有100個隨機元素的輸出。但該程序崩潰了不明原因給我。C++程序崩潰(超出時間限制)

這裏的主要

int main() 
{ 
    node* a[100],*b,*temp,*temp2; 
    int num; 
    for(int i=0;i<100;i++) 
    {  
     a[i]=NULL;; 
    } 
    for(int i=0;i<100;i++) // If this loop is less than 30 , it runs 
    { 
     num=(1+ (rand() %100)); 

     insert_node(a,num); 
    } 
    display(a); 
} 

這裏的插入功能

void insert_node(node **q,int data) 
{ 
    node *temp,*temp2; 
    int pos; 
    pos=hash_function(data); 
    if(q[pos]==NULL) 
    { 
     temp=new node; 
     temp->next=NULL; 
     temp->data=data; 
     q[pos]=temp; 
    } 
    else 
    { 
     temp2=q[pos]; 
     while(temp2->next != NULL) 
     { 
      temp2=q[pos]; 
      temp2=temp2->next; 
     } 
     temp=new node; 
     temp->next=NULL; 
     temp->data=data; 
     temp2->next=temp; 
    } 
} 

而這裏的noobie散列函數。

int hash_function(int data) 
{ 
    return 1+(rand() %100); 
} 

這裏的顯示一個

void display(node **q) 
{ 
    node * temp; 
    for(int i=0;i<100;i++) 
    { 
      temp=q[i]; 
      if(temp !=NULL) 
     { 

      cout<<"\n Position : "<<i<<" , Elements : "; 
      while(temp->next != NULL) 
      { 
       cout<<" "<<temp->data; 
       temp=temp->next; 
      } 
      cout<<" "<<temp->data; 
     } 
    } 


} 

PS:請不要對我對散列嘗試判斷。真的是一個noob程序員。感謝advace。

+1

「它的工作原理」 或 「不」 是沒有用的語句。請在帖子中添加以下內容:您期望*發生什麼,以及發生了什麼*實際上* –

+0

@BenWainwright,編輯。下次再介意。 –

+1

您是否嘗試過使用調試器? –

回答

2

您這裏有一個無限循環:

temp2=q[pos]; 
    while(temp2->next != NULL) 
    { 
     temp2=q[pos]; 
     temp2=temp2->next; 
    } 

通過你纔去到下一個設置temp2q[pos]每執行一次循環。所以你永遠不會通過鏈表的第二個元素,並且它永遠不會找到NULL指針。

擺脫循環中的temp=q[pos];行,它應該在循環之前完成一次。

另一個問題是數組索引是從零開始的,所以在計算哈希碼時不應該添加1

int hash_function(int data) 
{ 
    return (rand() %100); 
} 

DEMO

+0

另一個問題:a [100] =>索引0-99;返回1+(rand()%100)=>值:1-100 ... q [100]將是溢出。 –

+0

@ Florianp.i。是的,修正了這個問題。非常感謝。 –

+0

@Barmar,做了你所說的並完全理解了邏輯錯誤。但它仍然發生idk爲什麼。我把整個print語句都打上了,看起來只有當一個元素已經存在時纔會崩潰,並且我們用一些元素插入列表中。 **編輯:**它給在線編譯器的「運行時錯誤」。 雖然眼睛指向邏輯錯誤的感謝! –