C语言之求数组中第二大元素的值
2026/8/9 12:22:40 网站建设 项目流程

核心思路:

(一)数组去重

移除所有重复出现的元素,使数组中每个数值只保留一个。

方法

双重循环 + 覆盖删除。

  • 外层循环用i固定当前元素。
  • 内层用while循环遍历i之后的所有元素。
  • 如果发现num[j] == num[i],说明j位置是重复元素:
  1. j后面的所有元素前移一位(覆盖num[j])。
  2. 数组有效长度len减 1。
  3. j不增加(因为新的元素移到了j位置,需要重新检查)。
if (num[i] == num[j]){ // 删除 num[j] for (int k = j; k < len - 1; k++){ num[k] = num[k + 1]; } len--; // 缩短长度 // j不增加,继续检查当前位置 }
  • 如果不相等,则j++,继续检查下一个位置。
else{ j++; // 只有不相等时才移动 j }

关键点

删除元素后,j回退,确保不会漏掉因前移而进入j位置的新元素。

(二)处理去重后的数组

根据去重后的数组长度len,分情况讨论:

情况 1:len == 1

  • 说明数组中所有元素值都相同(去重后只剩一个)。

  • 没有第二大元素,直接输出提示并结束。

if (len == 1){ printf("数组中所有元素相同,无第二大元素"); return 0; }

情况 2:len >= 2

  • 初始化最大值和次大值

    • 比较num[0]num[1],较大的赋给max,较小的赋给secondMax

    • 这样初始化的好处是:如果数组只有两个元素,它们就是最终结果,无需进入循环。

if (num[0] > num[1]) { max = num[0]; secondMax = num[1]; } else { max = num[1]; secondMax = num[0]; }
  • 遍历剩余元素(从i = 2开始):

    • 如果num[i] > max
      说明发现了新的最大值,原来的max降级为secondMax,更新max = num[i]

    • 否则如果num[i] > secondMax
      说明当前元素比次大值大(但小于最大值),直接更新secondMax

    • 注意:这里不需要考虑num[i] == max的情况,因为去重后已保证所有元素值不重复。

for (int i = 2; i < len; i++) { if (num[i] > max){ // 新最大值,旧最大值降级为次大 secondMax = max; max = num[i]; } else if (num[i] > secondMax){ // 比次大大,直接更新次大 secondMax = num[i]; } }

完整代码如下:

#include <stdio.h> int main() { int num[8]; int len = sizeof(num) / sizeof(num[0]); int max, secondMax; // 1.输入数组 printf("请输入%d个元素:", len); for (int i = 0; i < len; i++){ scanf("%d", &num[i]); } // 2.数组去重 for (int i = 0; i < len - 1; i++){ int j = i + 1; while (j < len){ if (num[i] == num[j]){ // 删除 num[j] for (int k = j; k < len - 1; k++){ num[k] = num[k + 1]; } len--; // 缩短长度 // j不增加,继续检查当前位置 } else{ j++; // 只有不相等时才移动 j } } } printf("去重后长度len=%d\n", len); // 3.根据去重后元素个数分开求解 // 如果去重后只有一个元素 if (len == 1){ printf("数组中所有元素相同,无第二大元素"); return 0; } // 去重后有2个及以上 else{ // 先初始化,防止两个变量都是最大值 // 如果去重后只有2个元素则下面初始化为最后结果 if (num[0] > num[1]) { max = num[0]; secondMax = num[1]; } else { max = num[1]; secondMax = num[0]; } // 如果有2个则不满足for循环条件不执行下面循环,上面初始化为最后结果 // 如果是2个以上则执行循环更新最大和次大值 for (int i = 2; i < len; i++) { if (num[i] > max){ // 新最大值,旧最大值降级为次大 secondMax = max; max = num[i]; } else if (num[i] > secondMax){ // 比次大大,直接更新次大 secondMax = num[i]; } } printf("该数组中第二大元素:%d\n", secondMax); return 0; } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询