C言語でポインタを使って配列から要素を削除するプログラム
問題
実行時にユーザーが入力した配列から指定した要素を削除し、削除後の結果を画面に表示するCプログラムを作成します。削除対象の位置が配列の範囲外である場合は、「Invalid Input(無効な入力)」と表示する必要があります。
解決策
配列とは、共通の性質を持つ複数の要素を一つの名前でまとめて管理できるデータ構造です。配列に対しては、主に以下のような操作を行うことができます。
- 挿入(Insert)
- 削除(Delete)
- 検索(Search)
本記事では、この中でも「削除」に焦点を当て、ポインタを使った実装方法を解説します。配列から要素を削除する場合、その位置以降の要素をすべて左に1つずつずらすことで、隙間を埋めるのが基本的な考え方です。
アルゴリズム
ポインタを使用して配列から要素を削除する手順は以下の通りです。
ステップ1 − 要素数を表す変数を宣言し、値を読み込みます。
ステップ2 − 実行時に配列のサイズを指定します。
ステップ3 − 配列の各要素を入力します。
ステップ4 − ポインタ変数を宣言します。
ステップ5 − malloc関数を使って、実行時にメモリを動的に確保します。
ステップ6 − 削除したい要素の位置を入力します。
ステップ7 − 削除後、その位置以降の要素を左に1つずつずらして隙間を埋めます。
実行例
配列のサイズ:5
配列の要素:
1 2 3 4 5
削除する要素の位置:4
出力は以下のようになります。
After deletion the array elements are: 1 2 3 5
Cプログラムの例
以下は、ポインタを使用して配列から要素を削除するCプログラムの完全なコードです。
#include<stdio.h>
#include<stdlib.h>
void delete(int n,int *a,int pos);
int main(){
int *a,n,i,pos;
printf("enter the size of array:");
scanf("%d",&n);
a=(int*)malloc(sizeof(int)*n);
printf("enter the elements:\n");
for(i=0;i<n;i++){
scanf("%d",(a+i));
}
printf("enter the position of element to be deleted:");
scanf("%d",&pos);
delete(n,a,pos);
return 0;
}
void delete(int n,int *a,int pos){
int i,j;
if(pos<=n){
for(i=pos-1;i<n;i++){
j=i+1;
*(a+i)=*(a+j);
}
printf("after deletion the array elements is:\n");
for(i=0;i<n-1;i++){
printf("%d\n",(*(a+i)));
}
}
else{
printf("Invalid Input");
}
}コードのポイント
- 動的メモリ確保: malloc関数により、実行時に必要なサイズ分だけint型のメモリを確保しています。これにより、コンパイル時にサイズを固定せず柔軟な配列操作が可能になります。
- ポインタ演算: *(a+i) という記法は、a[i] と同じ意味です。ポインタを使って配列要素に直接アクセスしている点が本プログラムの特徴です。
- 要素の左詰め処理: 削除位置以降の各要素について、*(a+i) = *(a+j)(j = i+1)と代入することで、後ろの要素を1つ前へ移動させています。
- 入力チェック: pos が配列サイズ n 以下かどうかを判定し、範囲外の場合は「Invalid Input」を表示して不正な入力を防いでいます。
出力
上記のプログラムを実際に実行すると、次のような結果が得られます。
enter the size of array:5 enter the elements: 12 34 56 67 78 enter the position of element to be deleted:4 After deletion the array elements are: 12 34 56 78
この例では、5つの要素を持つ配列から4番目の要素「67」が削除され、残りの要素が正しく表示されていることが確認できます。
-
【初心者向け】C言語のポインタを使って配列要素の合計を計算する方法
ポインタとは?ポインタ(Pointer)とは、他の変数のアドレス(メモリ上の場所)を格納するための変数のことです。例えば、次のような変数宣言を見てみましょう。int qty = 179;この場合、変数 qty には値 179 が格納されています。ポインタは、この qty が配置されているメモリ上のアドレスを保持することができます。ポインタの宣言ポインタを宣言する構文は以下の通りです。int *p;ここで p はポインタ変数であり、他の int 型変数のアドレスを保持します。宣言時には、変数名の前に間接演算子 *(アスタリスク)を付けます。ポインタの初期化ポインタ変数を初期化するには、アドレス演
-
C#の配列から要素を削除する方法【サンプルコード付きで解説】
C#の配列は固定長のため、要素を直接「削除」することはできません。そこで一般的に用いられるのが、削除したい位置以降の要素を一つ前へずらす(シフトする)ことで、実質的にその要素を取り除く手法です。 基本的な考え方:要素をシフトして削除する まず、次のように5つの要素を持つ配列を用意します。 int[] arr = new int[5] {35, 50, 55, 77, 98}; たとえば2番目の位置(pos = 2、つまり arr[1])の要素「50」を削除したい場合は、その位置より後ろにある要素をすべて一つずつ前に移動させます。 // 削除位置以降の要素を前方へシフト for (i