数组元素的移动和删除

问题1 给定一个数组,将数组忠某个元素向右移动K个位置,k为非负数。

思路 : 首先创建一个数组,并打印;然后进行数组元素的交换,从被指定的移动的第n个元素开始一次向后进行元素交换,交换次数为元素移动的位数。

代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define N 7

void Move_Arr(int A[], int num, int k) {   // 数组被隐式转化成指针
	int temp = 0;
	int i, j;
	for (i = num; i <= k; i++) {  
		// 交换数组元素
		temp = A[i-1];
		A[i-1] = A[i];
		A [i] = temp;
	}
	return; // 无返回值, 这个 return 表示该函数结束。
}

int main() {
	int num = 0;
	int k = 0;
	int A[N] = { 10,20,45,20,5,5,4 };
	// 打印数组
	for (int i = 0; i < N; i++) {
		printf("%d ", A[i]);
	}
	printf("\n");
	printf("请输入要移动的第几个元素 num 和移动的位数 k :");
	scanf("%d%d", &num,&k);
	printf("\n将第 num 个元素移动 k 位的结果为:\n");
	Move_Arr(A, num, k); // 调用移动函数
	// 打印移动后的数组
	for (int i = 0; i < N; i++) {
		printf("%d ", A[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}



运行结果如下: 

10 20 45 20 5 5 4
请输入要移动的第几个元素 num 和移动的位数 k :1 3

将第 num 个元素移动 k 位的结果为:
20 45 20 10 5 5 4
请按任意键继续. . .

问题 2: 给定一个数组 nums 和一个值 val ,需要原地移除所有数值等于 val 的元素,返回移除后数组。

思路: 对数组进行遍历,直到遇到要删除的数组元素;每删除一个元素该元素后面的所有元素要向前挪动一位;再寻找下一个要删除的元素,再将每个元素向前移动一位。

代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
# define N 10
int main() {
	int i, j, k= 0;
	int m = 0;
	// 创建数组
	int A[N] = { 0,5,5,8,5,5,4,5,7,10 };
	printf("删除前的数组元素为:\n");
	for (i = 0; i < N; i++) {
		printf("%d ", A[i]);
	}
	// 指定元素
	printf("\n请输入要删除的元素:");
	scanf("%d", &m);
	// 删除
	
	for (i = 0; i < N; i++) {
		if (A[i] == m) {
			for (j = i; j < N; j++) {  
				A[j] = A[j + 1];  // 删除一个,每个元素先前挪动一位。
			}
			k++;
			i = 0;  // 重新遍历一次,以防重复。如; 1,5,5,5,5
		}
	}
	printf("删除后的数组有效元素个数为:%d:\n", (N - k));
	for (i = 0; i < (N - k); i++) {
		printf("%d ", A[i]);
	}
	system("pause");
	return 0;
}


运行结果为:
删除前的数组元素为:
0 5 5 8 5 5 4 5 7 10
请输入要删除的元素:5
删除后的数组有效元素个数为:5:
0 8 4 7 10
请按任意键继续. . .
发布了21 篇原创文章 · 获赞 2 · 访问量 870

猜你喜欢

转载自blog.csdn.net/weixin_44132627/article/details/104112564