2016-12-11 16 views
1

配列があるとします:int list[] = {1, 2, 4, 5, 6}; そして配列を中央から右にシフトし、4の代わりに3を配置したいので、次のようになります:{1, 2, 3, 4, 5, 6}それ?ありがとうございました。要素をシフトして配列に追加する

+3

配列の長さを増やすことはできません。 – user31264

答えて

2

あなたは、ベクターを使用することができない場合は、1つの解決策は、次のとおりです。

  • は(最後にいくつかの空の位置を有する)多くのスペースを持つ配列を作成します。すでに追加要素の数をカウントする

    int * array = malloc(sizeof(int) * array_size);

  • 利用二つの変数1が(size呼ばれます)配列のサイズを保存するには、別の(number_of_elements_in_the_arrayと呼ばれることができます)

に追加しました位置 'x'にある要素は、配列のx <のサイズで、

int tmp = array[x]; // save the current value 
array[x] = new_value; // update with the new value 
int tmp2; 
number_of_elements_in_the_array++; 

// we reach the limited 
if(number_of_elements_in_the_array == size) 
{ 
    size = 2 * size; //lets double that size 
    int *new_array = malloc(sizeof(int) * size); 

    // copy the first elements 
    for(int i = 0; i <= x; i++) 
     new_array[i] = array[i]; 

    new_array[x+1] = tmp; 

    // copy the last elements 
    for(int i = x+1; i < number_of_elements_in_the_array; i++) 
     new_array[i+1] = array[i]; 

    free(array) // free the old space 
    array = new_array; // update the new pointer 
}  
else 
{ 
    // shift the remaining elements 
    for(int i = x+1; i < number_of_elements_in_the_array; i++) 
    { 
     tmp2 = array[i]; 
     array[i] = tmp; 
     tmp = tmp2; 
    } 

}

制限付きで新しいアレイを作成し、古いアレイから新しいアレイにコピーし、それに応じて変数number_of_elements_in_the_arraysizeを更新します。

免責事項:私はテストしていないので、多少のマイナーエラーがあるかもしれませんが、全体的なイデアはそこにあります。

+0

問題はありません。コードを追加しました。 – dreamcrash

5

C++標準ライブラリを使用できる場合、std::vectorは配列の代わりです。それはあなたが欲しいものを行うには、専用のメソッドinsertを持っている:あなたはどこに新しい要素を挿入することがわかっている場合

std::vector<int> v; 
... // add elements 1, 2, 4, 5, 6 to it 
v.insert(v.begin() + 2, 3); // insert 3 at position 2 

これは良いです。しかし、あなたのリストは常にソートされていなければならず、ソートされたままになるように新しい要素を挿入する必要があります。もしそうなら、あなたはより良いstd::multisetを使用します。ここでは

std::multiset<int> v; 
... // add elements 1, 2, 4, 5, 6 to it 
v.insert(3); // insert 3 

、あなたはどこに新しい要素を挿入するために指示する必要がありません。

関連する問題