我试图在多个函数之间通过引用(或者更确切地说,通过指针)传递。我理解通过引用传递的基础知识,并成功地管理了各个函数。我似乎无法理解如何通过引用传递一个变量沿多个函数。
int main(int argc, char const *argv[])
{
int* quicksort(int*, int, int, long long int*);
int *sortedList = malloc(MAX_LENGTH * sizeof(int));
long long int compCount=0;
sortedList = quicksort(LIST, 0, MAX_LENGTH-1, &compCount);
printf("%lld", compCount);
return 0;
}
int* quicksort(int* A, int l, int r, long long int* compCount) {
int partition(int*, int, int, long long int*);
int p;
if (!(l < r)) {
return A;
}
else {
p = partition(A, l, r, compCount);
quicksort(A, l, p-1, compCount);
quicksort(A, p+1, r, compCount);
}
return A;
}
int partition(int *A, int l, int r, long long int* compCount) {
int i, j, p, tmp;
i = l + 1;
p = l;
for (j = l + 1; j <= r; j++) {
if (A[j] < A[p]) {
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
i = i+1;
}
}
compCount += r-l;
tmp = A[l];
A[l] = A[i-1];
A[i-1] = A[l];
return i-1;
}
我在此结束时获得了compCount = 0的值。我知道我可以通过使用全局变量来解决这个问题,但我宁愿不使用全局变量。
我如何误用我的指针?
答案 0 :(得分:1)
您正在函数之间正确传递指针。问题是你正在更新指针而不是它指向的指针。
compCount += r-l;
应该是:
*compCount += r-l;
与此问题无关,排序是就地完成的,因此sortedList
将被指定与原始列表相同的指针,并且您的malloc
将被删除并将被泄露。
答案 1 :(得分:1)
请注意,quicksort
(int *
)的结果无效。签名令人困惑:可以相信quicksort
接受数组A
并返回A
的排序副本(A
未被修改)。显然A
就地修改了。那么回归A
的兴趣是什么?让我们注意,对quicksort
的2次递归调用只是忽略了返回的值。此返回值无用。 BTW主要是什么LIST
(未声明)?不应该是SortedList吗?
你的功能的签名应该是:
void quicksort(int* A, int l, int r, long long int* compCount);
您现在可以使用返回值来返回比较次数(顺便说一下long
就足够了):
long quicksort(int* A, int l, int r) {
int partition(int*, int, int, long*);
int p;
if (!(l < r)) {
return 0;
} else {
long compCount = 0;
p = partition(A, l, r, &compCount);
compCount += quicksort(A, l, p-1);
compCount += quicksort(A, p+1, r);
}
return compCount;
}
补充说明:partition
可以简化,因为它现在总是收到compCount = 0
因此:
*compCount += r-l;
变为
*compCount = r-l;
因此,不再需要在compCount
中初始化quicksort
:
long quicksort(int* A, int l, int r) {
int partition(int*, int, int, long*);
int p;
long compCount;
if (!(l < r)) {
return 0;
}
p = partition(A, l, r, &compCount);
return compCount + quicksort(A, l, p-1) + quicksort(A, p+1, r);
}
答案 2 :(得分:0)
你所谓的引用,你实际上是按值传递指针。传递指针时,可以通过解除引用来更改指针的内容,因此您应该执行以下操作:
*compCount += r-l;