C语言指针应用:找出首个数组中不在第二个数组的最大元素
解决思路与代码修改
你的需求是从第一个数组中找出不属于第二个数组的最大元素,并获取它的位置。原代码已经实现了单数组找最大值的逻辑,但缺少两个关键部分:第二个数组的输入处理,以及验证元素是否存在于第二个数组的判断逻辑,同时还要处理“最大值在第二个数组中”的情况——这时候需要往下找次大的符合条件的元素。
完整修改后的代码
#include <stdio.h> // 用指针实现:检查target是否存在于arr数组中,size是数组长度 int isPresent(long *arr, long size, long target) { long *end = arr + size; // 数组末尾的下一个位置指针 while (arr < end) { if (*arr == target) { return 1; // 找到,返回1 } arr++; // 指针移动到下一个元素 } return 0; // 没找到,返回0 } int main() { long array1[100], array2[100]; long size1, size2, c; long max_val = -1; // 初始化最大符合条件的值,可根据实际数值范围调整 long location = -1; // 初始化位置,-1表示未找到符合条件的元素 // 输入第一个数组 printf("Enter the number of elements in first array\n"); scanf_s("%ld", &size1); printf("Enter %ld integers\n", size1); for (c = 0; c < size1; c++) scanf_s("%ld", &array1[c]); // 输入第二个数组 printf("Enter the number of elements in second array\n"); scanf_s("%ld", &size2); printf("Enter %ld integers\n", size2); for (c = 0; c < size2; c++) scanf_s("%ld", &array2[c]); // 遍历第一个数组,找出不在第二个数组中的最大元素 long *ptr = array1; // 用指针遍历第一个数组 long current_index = 0; while (ptr < array1 + size1) { // 如果当前元素不在第二个数组,且比当前记录的最大值大 if (!isPresent(array2, size2, *ptr) && *ptr > max_val) { max_val = *ptr; location = current_index + 1; // 位置从1开始计数 } ptr++; current_index++; } // 输出结果 if (location != -1) { printf("Maximum element not in second array is present at location number %ld and it's value is %ld.\n", location, max_val); } else { printf("All elements of first array are present in second array.\n"); } return 0; }
关键改动说明
- 添加第二个数组处理:新增了第二个数组的输入逻辑,确保能获取对比的数据源。
- 指针实现的存在检查函数:
isPresent函数用指针遍历数组,避免下标操作,更贴合你学习指针的需求。函数通过移动指针遍历数组,判断目标值是否存在。 - 调整最大值查找逻辑:不再只找全局最大值,而是遍历第一个数组的每一个元素,先验证它是否不在第二个数组中,再更新最大符合条件的值和位置。这样能确保找到的是所有符合条件元素中的最大值,而不是先找全局最大值再判断(如果全局最大值在第二个数组中,这种方式会自动找下一个更大的符合条件元素)。
- 异常情况处理:如果第一个数组的所有元素都在第二个数组中,会输出提示信息,避免无效输出。
额外优化建议
如果第一个数组元素较多,可以先对第一个数组排序(从大到小),然后遍历排序后的数组,找到第一个不在第二个数组中的元素,这样能减少遍历次数,提升效率。不过如果是学习阶段,当前的逻辑更直观,适合理解指针和数组的操作。
内容的提问来源于stack exchange,提问作者FullMetal
相关产品推荐
相关产品推荐

