C语言实现数组去重(动态内存分配)+小总结

#include <stdio.h>
#include <stdlib.h>

#define false -1   //  填补位,只是做标记,只要不是输入范围内的都可以


void show_array(int * a, int len);
int find_max(int * array_1,int len);
int * de_array(int * array_1, int len, int max);

int main()
{
//输入
	int i, len, max, cnt = 0;
//	int * pArr, de_pArr;    注意!!!
    int * pArr, *de_pArr;
//	int * de_pArr;

	scanf("%d", &len);//输入数组长度
	pArr = (int)malloc(sizeof(int)*len);
	for(i=0; i<len; i++)
    {
        scanf("%d", pArr+i); // 输入数组数据
    }

    max = find_max(pArr, len);
    de_pArr = de_array(pArr, len , max); //返回的数组

    for(i=0; i<max+1; i++) //整理数组,将-1全放到后面
    {
        if (de_pArr[i] != false)
        {
            de_pArr[cnt] = de_pArr[i];
            cnt++;
        }
    }
    show_array(de_pArr, cnt); //显示数组中不重复的数据
	return 0;
}

//    show_array(de_pArr, max+1);    这个函数可以是因为强制类型转换!
void show_array(int * a, int len)
{
    int i;
    for (i=0; i<len; i++)
    {
        printf("%d ,", *(a+i));
    }
}

int find_max(int * array_1, int len)
{
    //找到最大值
    int max, i;
    max = array_1[0];
    for(i=1; i<len; i++)
    {
        if (max < array_1[i])
        {
            max = array_1[i];
        }
    }
    return max;
}

int * de_array(int * array_1, int len, int max)
{
    int i;
    int * de_pArr = (int)malloc(sizeof(int)*max);
    for(i=0; i<max+1; i++) // 这里是有bug的,只能存放整数0——100以内的,正常应该是定义一个(max+1)的数组,因为需要用来存放元素位置
    {                      // 现在无错的。
        *(de_pArr+i) = false;
    }
    for(i=0; i<len; i++)
    {
        de_pArr[array_1[i]] = array_1[i];
    }
    return de_pArr;
}




这里我想提醒两点:

  • 1,在定义指针变量时,int * a, b的含义是既定义了 a 是 int类型指针变量,也定义了 b 是 int类型整数变量。而不是说定义了 a, b 都是int类型指针变量。int * pArr, *de_pArr;或者分两行定义都是可以的。
  • 2, 注意一点,程序中我刚开始定义错了,int * pArr, de_pArr;是这样定义的,其中 de_pArr是int整数类型,并不是地址。而我以为de_pArr是地址,所以在尝试输出 *(de_pArr) 与 pArr[0] 都出错了,但是在传入show_array函数却可以正常使用。我百思不得其解,后来明白,虽然de_pArr是int类型数据,但在传入函数时,进行了强制转换,将int 转换成了 int * 所以可以正常使用,而 *(de_pArr) 与 pArr[0] 自然会出错。 所以一定要注意函数定义!!!
  • 今天过了华为技术岗的笔试,刚整完综合测试,冲冲冲。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值