去除数组中的重复元素,保留第一次出现的元素
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; /*返回不同数的个数*/
}
逐行分析:
int fun(int a[], int n)- 函数声明,接收数组a和长度n,返回intint i,j=1;- 声明两个整型变量,i作为循环变量,j初始化为1(指向结果数组的下一个位置)for(i=1;i<n;i++)- 从下标1开始遍历数组(下标0的元素默认保留)if(a[j-1]!=a[i])- 检查当前元素是否与结果数组的最后一个元素不同a[j++]=a[i];- 如果不同,将当前元素复制到结果位置,然后j自增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 ();
逐行分析:
void main()- 主函数声明(标准写法应该是int main())int a[N]={...}- 声明并初始化测试数组,包含20个元素,有重复值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组测试数据:
fscanf(rf, "%d", &n)- 从文件读取数组长度for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j])- 读取n个整数到数组n = fun(a, n)- 调用去重函数for(j = 0 ; j < n ; j++) fprintf(wf, "%4d", a[j])- 将去重结果写入文件,每个数字占4个字符fprintf(wf, "\n")- 写入换行符
fclose(rf) ; fclose(wf) ;
- 关闭输入和输出文件
程序执行流程
- 初始化阶段:定义测试数组和变量
- 控制台演示:
- 显示原始数据
- 调用fun()去重
- 显示去重后数据
- 文件处理:
- 读取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)

浙公网安备 33010602011771号