C语言 函数的调用

我想把 before_insert 函数给上面那段调用,使其也有 before_insert 函数一样的功能。

这函数的功能是算出输入的数字放在第几位,例:
输入数字:3
数组为{1, 2, 3, 4, 5, 6, 7, 8, 9}
插在数组第2位
输入数字:4
数组为{1, 2, 3, 4, 5, 6, 7, 8, 9}
插在数组第3位

int TwoPointsRanking(int array[], size_t left, size_t right, int num) {
int mid = 0;

if (left == right) {
return (num > array[left]) ? left + 1 : left;
} else {
mid = (left + right) / 2;

if (num == array[mid]) {
return mid;
} else if (num < array[mid]) {
return TwoPointsRanking(array, left, mid - 1, num);
} else {
return TwoPointsRanking(array, mid + 1, right, num);
}
}
}

int main(int argc, char *argv[]) {
int value = 0;
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

while (1) {
printf("输入数字:");
scanf("%d", &value);

if (value == 0) {
printf("退出");
return 0;
} else {
printf("数组为{1, 2, 3, 4, 5, 6, 7, 8, 9}\n");
printf("插在数组第%d位\n", TwoPointsRanking(array, 0, 8, value));
}
}
}
字体有限,回复后我补上

你希望在TwoPointsRanking中完成插入数字?最好不要这样,因为这是一个递归函数,会产生多次的自身调用。
如果是希望定位后插入,可以在:

if (left == right) {
return (num > array[left]) ? left + 1 : left;
}

if (num == array[mid]) {
return mid;
}
里面加上,在return之前即可。追问

在这里 http://pan.baidu.com/s/1c0neK1q 转码老是转不成,你得下载才能看。。

我想拿这个函数给上面那段调用,把功能结合起来

追答

这两个函数的功能没有什么互补性,属于顺序完成的逻辑,因此你结合起来的意义不大,最好是顺序调用,或者再声明一个函数顺序调用这两个函数。

结合应该也可以,你那个云盘的代码没法看,太乱,自己按照下面的方式修改两处,试试吧。

if (left == right) {
        mid = (num > array[left]) ? left + 1 : left;
        before_insert(array,num,right,mid,9);
        return num;
    }

但必须要说,你这个before_insert并不适用于提问中已经给出的代码。因为你在main函数中的array是一个满数值的固定长度数组,insert之后,会去掉后面的数值,不会增加数组长度。

追问

main函数里面可以随便改,如果你觉得太乱我可以给你完整的http://pan.baidu.com/s/1hqqu0kO

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-10-31
再来点看看追问

在这里 http://pan.baidu.com/s/1c0neK1q 转码老是转不成,你得下载才能看。。

第2个回答  2014-10-31
其余代码呢追问

在这里 http://pan.baidu.com/s/1c0neK1q 转码老是转不成,你得下载才能看。。

追答

不知你是打算让谁调用before_insert 函数,但不管是 “让main函数在调用TwoPointsRanking函数之后,再调用before_insert 函数将该元素插入数组”,还是 “让TwoPointsRanking函数调用before_insert 函数将该元素插入数组”,before_insert 函数都要进行改写(去掉查找插入位置的功能,当然形参也要修改)。

追问

用main调用

main函数可以改动