ダブルポインター型の質問

1. 双方向ポインタの基本的な使い方

双方向ポインタは、配列全体を走査し配列要素を前後に交換する必要がある場合に広く使用されます。

原理は 2 つのポインタを設定し、配列全体を前から後ろに走査することです。基本的な記述方法は次のとおりです。

void Reverse(char arr[], int len)
{
	int left = 0;
	int right = len - 1;
    int tmp;
	while (left < right)
	{
		//条件
	}
}

2. 質問例

2.1 文字の逆順

文字列strの内容を反転して出力します。
データ範囲: 1 < len(str) < 10000
入力説明:
文字列を入力します。スペースを含めることもできます。
出力説明:
文字列を逆順に出力します。

void Reverse(char arr[], int len)
{
	int left = 0;
	int right = len - 1;
	char tmp;
	while (left < right)
	{
		tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[10001];
	gets(arr);//gets可以读取包括空格在内的字符串
	int len = strlen(arr);
	Reverse(arr, len);
	printf("%s\n", arr);
}

2.2 パリティスワップ

質問:
整数の配列を入力し、配列内のすべての奇数が配列の前半に配置され、すべての偶数が配列の後半に配置されるように、配列内の数値の順序を調整する関数を実装します。配列。

アイデア: 双方向ポインタを使用して配列全体を走査する 合計 4 つの状況が発生する可能性があります。

1. 前は奇数、後ろは偶数        // 最も理想的な状況、操作は必要ありません—> 左++ 右--

2. 奇数の前でも       // ——> 左右を入れ替え、左++ 右--

3. 前方のカップルと後方のカップル       //前方のカップルを後方に変更する必要があり、右にトラバースを続ける必要があります --> 右--

4. 前後の奇数        // 後の奇数を前に変更する必要があり、左をトラバースし続ける必要があります --> left++

答え:

void reverse(int arr[], int len)
{
	int tmp;
	int left = 0;
	int right = len - 1;
	while (left < right)
	{
		if (arr[left] % 2 == 0 && arr[right] % 2 == 1) 
		{
			tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
		else if (arr[left] % 2 == 0 && arr[right] % 2 == 0)
		{
			right--;
		}
		else if (arr[left] % 2 == 1 && arr[right] % 2 == 1)
		{
			left++;
		}
		else
		{
			left++;
			right--;
		}
	}
}

int main()
{
	int arr[10];
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	int len = sizeof(arr) / sizeof(arr[0]);
	reverse(arr, len);
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/m0_75186846/article/details/132129432