去除数组中的重复元素,保留第一次出现的元素

C程序逐行分析

程序功能概述

这个程序的主要功能是去除数组中的重复元素,保留第一次出现的元素。

详细逐行分析

头文件和宏定义

#include <stdio.h>
#define N 80
  • #include <stdio.h> - 包含标准输入输出库,提供printf、scanf、文件操作等函数
  • #define N 80 - 定义常量N为80,作为数组的最大容量

核心函数 fun()

int fun(int a[], int n)
{
    int i,j=1;
    for(i=1;i<n;i++)
        if(a[j-1]!=a[i]) /*若该数与前一个数不相同,则要保留*/
            a[j++]=a[i];
    return j; /*返回不同数的个数*/
}

逐行分析:

  1. int fun(int a[], int n) - 函数声明,接收数组a和长度n,返回int
  2. int i,j=1; - 声明两个整型变量,i作为循环变量,j初始化为1(指向结果数组的下一个位置)
  3. for(i=1;i<n;i++) - 从下标1开始遍历数组(下标0的元素默认保留)
  4. if(a[j-1]!=a[i]) - 检查当前元素是否与结果数组的最后一个元素不同
  5. a[j++]=a[i]; - 如果不同,将当前元素复制到结果位置,然后j自增
  6. return j; - 返回去重后的元素个数

算法原理:

  • 第一个元素(a[0])自动保留
  • 从第二个元素开始,只有与前面保留的最后一个元素不同时才保留
  • 使用双指针技术:i遍历原数组,j指向结果数组的插入位置

主函数 main()

void main()
{  
    int  a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;
    void NONO ();

逐行分析:

  1. void main() - 主函数声明(标准写法应该是int main()
  2. int a[N]={...} - 声明并初始化测试数组,包含20个元素,有重复值
  3. void NONO (); - 声明NONO函数
   printf("The original data :\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
  • 打印原始数据标题
  • 循环输出原数组,每个数字占3个字符宽度
   n=fun(a,n);
  • 调用fun函数进行去重操作,返回新的元素个数
   printf("\n\nThe data after deleted :\n");
   for(i=0;i<n;i++)printf("%3d",a[i]); 
   printf("\n\n");
  • 打印去重后的数据标题
  • 输出去重后的数组
   NONO();
  • 调用NONO函数处理文件数据

文件处理函数 NONO()

void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf; 
  int a[N], n, i, j ;
  • 声明文件指针rf(读取)和wf(写入)
  • 声明局部变量:数组a、长度n、循环变量i和j
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  • 以读模式打开输入文件"in.dat"
  • 以写模式打开输出文件"out.dat"
  for(i = 0 ; i < 5 ; i++) {
    fscanf(rf, "%d", &n) ;
    for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
    n = fun(a, n) ;
    for(j = 0 ; j < n ; j++) fprintf(wf, "%4d", a[j]) ;
    fprintf(wf, "\n") ;
  }

处理5组测试数据:

  1. fscanf(rf, "%d", &n) - 从文件读取数组长度
  2. for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) - 读取n个整数到数组
  3. n = fun(a, n) - 调用去重函数
  4. for(j = 0 ; j < n ; j++) fprintf(wf, "%4d", a[j]) - 将去重结果写入文件,每个数字占4个字符
  5. fprintf(wf, "\n") - 写入换行符
  fclose(rf) ; fclose(wf) ;
  • 关闭输入和输出文件

程序执行流程

  1. 初始化阶段:定义测试数组和变量
  2. 控制台演示
    • 显示原始数据
    • 调用fun()去重
    • 显示去重后数据
  3. 文件处理
    • 读取in.dat文件中的5组测试数据
    • 对每组数据调用fun()去重
    • 将结果写入out.dat文件

算法特点

  • 时间复杂度:O(n),只需遍历一次数组
  • 空间复杂度:O(1),原地修改数组
  • 适用条件:数组必须是有序的(相同元素相邻)
  • 优点:高效、节省内存
  • 局限性:只能处理相邻重复元素,不能处理分散的重复元素

示例执行结果

输入数组[2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10]

输出数组[2,3,4,5,6,7,8,9,10](长度从20变为9)

posted @ 2025-08-31 20:41  量子我梦  阅读(21)  评论(0)    收藏  举报