#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] 自然会出错。 所以一定要注意函数定义!!! - 今天过了华为技术岗的笔试,刚整完综合测试,冲冲冲。