2017-02-16 3 views
1

キーと要素を持つ辞書を作成しました。それはキーフィールドによって順序付けられ、ディクショナリに割り当てられたスペースは、それが含む要素の数と常に等しくなければなりません。だから、これは私がやったことです:配列struct(Dictionary)をC言語で挿入

//Creating a Dictionary structure 
    typedef struct dict{ 
     int elem; 
     int key; 
    }Dictionary; 

int main(){ 
    Dictionary * d = NULL; 
    int dim = 0; 

    insert(&d, 5, 3, &dim); 
    insert(&d, 10, 2, &dim); 
    insert(&d, 6, 1, &dim); 
    //insert(&d, 9, 6, &dim); 
    //insert(&d, 55, 2, &dim); 
    //insert(&d, 11, 5, &dim); 
    return 0; 
} 


void insert(Dictionary **d, int elem, int key, int *dim){ 
    (*d) =(Dictionary *)realloc((*d),(*dim)++);//adding space for another element 
    int i = 0, j = 0; 
    while(i < (*dim) && (*d)[i].key < key)//searching for the corect position to insert 
     i++; 

    //sliding all the lements to the right 
    for(j = (*dim); j > i; j--){ 
     (*d)[j] = (*d)[j - 1]; 
    } 

    //iserting the element in the correct position 
    (*d)[i].elem = elem; 
    (*d)[i].key = key; 
} 

それが問題を挿入する最初の3つの要素のために、私は前後を挿入しようとwhenerver私はinfinteループおよび5のような失速を得るかということである必要がありますようにコードが動作しますより多くの挿入がプログラムをクラッシュさせます。だから誰かが私に何が行方不明か、何が間違っているのかを私に説明することができましたか?

+0

'(* dim)++' ++は意味をなさない。それとは別に、_hash tables_を見てみましょう。これは、辞書に使用するのに適したADTであるためです。 – Lundin

答えて

2

(*d) =(Dictionary *)realloc((*d),(*dim)++);次の要素には十分なメモリを割り当てません。

しばらくすると、未割り当て/未所有のメモリが破損し、クラッシュします。

は、あなたのアカウントに(はBTW reallocを呼び出す前をインクリメントする必要があり、別の致命的な間違い)あなたの構造体のサイズを取らなければなりません。私はそれに騙さしまったので、私は事前に増分を提案していませんが、2行:

(*dim)++; 
(*d) = realloc((*d),sizeof(Dictionary)*(*dim)); 

ノート:

  • あなたがreallocの出力をキャストする必要はありません、malloccalloc
  • eahステップで再割り当ては簡単ですが最適ではありません。 1スロット以上を転送する必要があります。また、予約が枯渇した場合にのみ再割り当てしてください。そうすれば、ブロックがあまりにも小さ過ぎると、reallocをあまりにも頻繁に呼び出すことや、周りを動かすことを避けることができます。
+0

私はそのようなコーディングがエラーにつながると確信しています:) thanks;私の方法を固定した。 –

関連する問題