2017-03-15 10 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); 
} 

ここに表示があります1

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プログラマ。ありがとうございました。

+1

"それは動作します" または "それはしません" 便利なステートメントではありません。あなたは*何が起こると予想されているのか、実際に何が起こったのか –

+0

@BenWainwright、編集されたものを投稿に追加してください。次回から気になります。 –

+1

デバッガを試しましたか? –

答えて

2

あなたはここに無限ループがあります:あなたは、次に行く前に戻っq[pos]temp2を設定するループを通る

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

たびに。したがって、リンクリストの2番目の要素を通過することは決してありません。NULLポインタは決して見つかりません。

ループ内でtemp=q[pos];行を取り除くには、ループの前に一度だけ行う必要があります。

もう1つの問題は、配列インデックスが0から始まるため、ハッシュコードを計算するときに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ステートメントを一貫して置いていますが、要素がすでに存在していて、いくつかの要素でリストに挿入しているときにクラッシュするようです。 **編集:**そのオンラインコンパイラでの「ランタイムエラー」。 論理エラーを指す目に感謝しますが!! –

関連する問題