2016-07-02 18 views
1

は、例えばCの配列から要素を削除するには?私は、アレイ</p> <pre><code>a = { 1,2,3 } </code></pre> <p>を持っていると私は[1]を削除したいので、結果が希望の場合

....それを行う方法についての方法を見つけるように見えることはできませんbe

a = { 1,3 } 

どのようにすることができますか?

+2

これを行う場合は、おそらく配列が問題の正しいデータ構造ではないことに注意してください。リンクリストや何らかの種類のツリーがうまくいくかもしれません – Vality

答えて

1

あなたができることは、削除された要素の後にあるすべての要素を1つ上に移動して、現在配列内の要素の数を示すサイズカウンタを保持することです。 C配列は、連続したメモリのブロックではありません。サイズを変更することはできません。

1

です。配列がstaticとして宣言されているか、または自動保存期間がある場合は、配列の実効サイズを変更する方法がないため、配列を保存できません。

回避策の1つは、削除しようとしている要素をすべて左にシフトしてから、配列の有効長を格納するために使用する2次変数を更新することです。

アレイが動的に割り当てられている場合は、新しいより短い配列を割り当てることができます。すべての要素を削除し、削除しようとしている要素をコピーして、完了しています。

+0

静的配列の作成方法は?定数として定義していない配列はありますか? – Gregborrelly

+0

配列を宣言するときに静的な接頭辞を置くだけです: '' 'static int a = {1、2、3};' – ifma

+0

@BackSlash 'static'と' const'は異なるものです:Cでは3つ保存期間:静的、自動および割り当て済み。 ISO/IEC 9899:TC3、6.2.4 - 1.ジャックは単に「割り当てられた記憶期間ではない」と言って、これを正式に正しく実行しました。 –

1

あなたはそうのように削除するために、インデックスに応じて、必要な要素をシフトすることができませんでした:

は編集:より堅牢なだけ新しい配列に上書きコピーするだけで作業する場合、もはや最後の要素を無視する必要があります1つのアレイ。 Cの配列から要素を削除する方法

int a = {1, 2, 3}; 
int new_a[sizeof(a)/sizeof(a[0]) - 1]; // new array will hold one less value 
int pos = 3; // delete the item at the third index 

for (i = pos - 1; i < sizeof(a)/sizeof(a[0]) - 1; i++) { 
    new_a[i] = a[i+1]; 
} 
+0

私は、これを実装しようとします参照してください。ありがとうございました。 – Gregborrelly

+5

'sizeof(a)/ sizeof(a [0])'は 'int 'が4バイトであると仮定するのではなく、' sizeof(a)/ 4'よりも優れています。また、この方法では、配列の使用量を把握する必要があります。または、要素の一部を削除した後に余分な残り物が残ることがあります。上の例のコードでは、配列の内容は変更されません。削除後の最後の要素を無視することがわかっていない限り、最後は '{1,2,3} 'です。 3番目の要素の代わりに2番目の要素を削除した場合は、配列の内容が変更される '{1、3、3} 'がありますが、最後の要素は無視しなければなりません。 – Dmitri

+0

@ドミトリーこの貴重な情報ありがとうございます。 – ifma

1


どうすればいいですか?

Cの配列の要素は削除できません。

要素は無視できますが、削除することはできません。 sizeof(a)は変更できません。配列が定義されると、要素の数は固定されます。

おそらく、より高いレベルのタスクへの新しいアプローチですか?

+0

何が示唆されますか?私は選択ソートの実装を書こうとしています。したがって、配列の最小値を見つけたら、それを削除するか無視する必要があります。だから次回ループが回ります。それは次の最小値などを見つけるでしょう。 – Gregborrelly

+0

C配列の代わりに別のデータ構造を使用してください。誰かがリンクされたリストを提案しました。上記の回答は、O(n)のパフォーマンスを削除するたびに非常に高額ですが、リンクされたリストはO(1)と思います。 – ifma

+0

@BackSlash「セクションソートを含むデータを削除する方法」の質問を検索することを提案します。見つけられないときは、あなたがしたこととチャレンジがどこにあるのかを示す質問を投稿してください。 – chux

0

これを配列で行うことはできません。代わりにリンクリストを使用してください。

+0

リンクリストに関する私の研究を開始する。ご協力ありがとうございました。 – Gregborrelly

関連する問題

 関連する問題