|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
//此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
//示例:
//输入: [2,0,2,1,1,0,2,1,0,1,0,2]
//输出: [0,0,0,0,1,1,1,1,2,2,2,2]
#include<stdio.h>
int main()
{
int sort(int *p,int n);
int i,k,n,*p,a[n];
scanf("%d",&n);
getchar();
for(i = 0;i < n;i++)
{
scanf("%d",&a[i]);
}
p = a;
k = sort(p,n);
printf("\n");
return 0;
}
int sort(int *p,int n)
{
int i,j,k = 0,count1 = 0,count2 = 0,count3 = 0;
int temp[3][9];
for(i = 0;i < n;i++)
{
if(*(p + i) == 0)
{
temp[0][count1] = 0;
count1 += 1;
}
else if(*(p + i) == 1)
{
temp[1][count2] = 1;
count2 += 1;
}
else
{
temp[2][count3] = 2;
count3 += 1;
}
}
temp[0][count1] = 88; // 设置元素终止符为数字88
temp[1][count2] = 88;
temp[2][count3] = 88;
for(j = 0;j < 3;j++)
{
for(i = 0;temp[j][i] != 88;i++)
{
if(temp[j][i] != 88)
{
*(p + k) = temp[j][i];
printf("%d ",*(p + k));
k++;
}
}
}
printf("\n");
return 0;
}
此程序 DEV_C++5.11 编译通过,却又不能执行,但将第6行定义数组的 n 改为12,整个程序运行正常,请问该如何修改?
本帖最后由 风过无痕1989 于 2020-10-27 19:30 编辑
受楼上巴巴鲁朋友的启发,修改一下数组 a[n] 的定义位置,程序运行正常。其实在此位置的 a[n] 数组已经不是一个彻头彻尾的变长数组了,它有了具体的元素个数
#include<stdio.h>
int main()
{
int sort(int *p,int n);
int i,k,n,*p;
scanf("%d",&n);
getchar();
int a[n];
for(i = 0;i < n;i++)
{
scanf("%d",&a[i]);
}
p = a;
k = sort(p,n);
printf("\n");
return 0;
}
int sort(int *p,int n)
{
int i,j,k = 0,count1 = 0,count2 = 0,count3 = 0;
int temp[3][n]; // 这里有一个不算大的错误,原定义为 temp[3][9],还是改成 n 好,与主数组长度保持一致
for(i = 0;i < n;i++)
{
if(*(p + i) == 0)
{
temp[0][count1] = 0;
count1 += 1;
}
else if(*(p + i) == 1)
{
temp[1][count2] = 1;
count2 += 1;
}
else
{
temp[2][count3] = 2;
count3 += 1;
}
}
temp[0][count1] = 88; // 设置元素终止符为数字88
temp[1][count2] = 88;
temp[2][count3] = 88;
for(j = 0;j < 3;j++)
{
for(i = 0;temp[j][i] != 88;i++)
{
if(temp[j][i] != 88)
{
*(p + k) = temp[j][i];
printf("%d ",*(p + k));
k++;
}
}
}
printf("\n");
return 0;
}
|
|