C语言 从递归函数传递指针



我被要求只用递归方法制作选择排序代码。所以我考虑制作另一个函数来查找存储最大值的数组,然后在我的另一个函数中切换它。

void p_rec_max(int data[], int cur, int arrSize,int * x) {
if(cur < arrSize - 1) {
if(data[cur] > data[arrSize - 1]) {
*x = cur;
} else if(data[cur] < data[arrSize - 1]){
*x = arrSize - 1;
}
p_rec_max(data,cur + 1,arrSize,&x);
}
}
void rec_selection_sort(int data[], int arrSize) {
if(arrSize > 0) {
int maxi,temp;
p_rec_max(data,0,arrSize,&maxi);
temp = data[arrSize - 1];
data[arrSize - 1] = data[maxi];
data[maxi] = temp;
rec_selection_sort(data,arrSize - 1);
}
}

它得到了这样的警告

在函数"p_rec_max"中: 警告:从不兼容的指针类型传递"p_rec_max"的参数 4 [默认启用] 注意:预期为"int *",但参数的类型为"int **">

而且它根本不会改变我的数组。 我缺乏在函数中传递指针的信息无法帮助我解决这个问题。 你们能修复我的代码,然后向我解释我的代码有什么问题吗? 谢谢

第一个问题

您有此行问题:

p_rec_max(data,cur + 1,arrSize,&x);
^^

因为x是一个int *&x是一个int **,这不是函数所期望的。

将行更改为:

p_rec_max(data,cur + 1,arrSize, x);

x面前没有&

第二个问题

p_rec_max函数找不到最大数组值的索引。

如果所有数组元素都相同,则代码将永远不会执行*x = ...。换句话说,maxi永远不会被写入,你最终会在这里使用一个未初始化的索引data[arrSize - 1] = data[maxi];这是未定义的行为,可能会使您的程序崩溃。

除此之外,我认为函数中的基本逻辑是错误的。代码始终将cur与最后一个数组元素进行比较。这似乎是错误的。我认为您应该将cur与迄今为止找到的最大值进行比较。这可以使用变量x来完成。

像这样:

void p_rec_max(int data[], int cur, int arrSize,int * x) {
if(cur < arrSize) {
if(data[cur] > data[*x]) {
*x = cur;
}
p_rec_max(data, cur + 1, arrSize, x);
}
}

rec_selection_sort这样称呼它:

maxi = 0;  // Assume index zero holds the maximum
p_rec_max(data, 1, arrSize, &maxi);
^
Start searching from index 1

顺便说一句:使用递归函数来查找数组中的最大值不是一个好方法,但我想你不允许使用简单的forwhile循环。

最新更新