1

我必须为我的冒泡排序编写一个交换函数
这就是我所拥有的:

void swap(int arr[], int size, int i, int j)
{
    int temp = *(arr+i);
    *(arr + i) = *(arr+j);
    *(arr+j) = temp;
}

当我尝试运行时,出现以下错误:

警告 C4013:“交换”未定义;假设 extern 返回 int 错误 C2371: 'swap' : redefinition; 不同的基本类型

当我将函数更改为 的类型时int,它确实有效,知道为什么吗?

我不需要原型,因为它在 main 函数之前……是吗?

这是整个代码:

//BubbleSort

    void bubbleSort(int arr[], int size)
    {
        int i,j;
        for(i=0; i < size; i++)
        {
            for(j=i+1; j < size; j++)
            {
                if(*(arr+i) > *(arr+j))
                {
                     /*temp = *(arr+i);
                    *(arr + i) = *(arr + j);
                    *(arr + j) = temp;*/
                    swap(arr,i,j);
                }
            }
        }
    }
    void swap(int arr[], int i, int j)
    {
        int temp = *(arr+i);
        *(arr + i) = *(arr+j);
        *(arr+j) = temp;
    }
    void main()
    {
        int i, arr[] = {8,0,6,-22,9};
        bubbleSort(arr, sizeof(arr)/sizeof(int));
        for(i=0; i < sizeof(arr)/sizeof(int); i++)
        {
            printf("%d, ",*(arr+i));
        }
        printf("\n");
    }
4

7 回答 7

2

您似乎缺少该功能的适当原型。

添加

void swap(int arr[], int size, int i, int j);

在第一次通话之前。

此外,在索引中使用这种以指针为中心的表示法并没有什么意义,尤其是因为您将arr参数声明为数组,所以会让人感到困惑。使用它更清洁:

const int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;

还要注意consttemp值的使用,因为它在分配后不会改变。在 3 行函数中没什么大不了的,但是一个好习惯。

于 2012-03-30T14:18:35.577 回答
2

您需要放置void swap(int arr[], int i, int j)在顶部,void bubbleSort()因为您使用的是swap()inside bubbleSort()

如果不是,您将遇到 C 的隐式声明,即在 中main(),您正在调用bubbleSort()并将bubbleSort()调用swap(),但此时,bubbleSort()不知道您的声明,swap()因为它是在其下方声明的。因此,您的编译器理解的是您正在调用 a swap()which is implicitly declared

后来,当你的编译器遇到你真正的声明时void swap(int arr[], int i, int j),它会抱怨它是一个重新定义。

除了将您的swap()声明移到最顶层之外,您还可以通过将函数声明放在最顶层以及下面的定义来解决separately


此外,您似乎没有以正确的方式使用指针,因为您已经传递int arr[]swap()函数中,您可以在其中进行直接交换,正如@unwind 指出的那样:

const int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;

考虑一下swap()

void swap(int *x, int *y){
int temp = *x;
*x=*y;
*y=temp;
}

这对于您了解实际上可以content通过将地址传递给函数来更改变量的值很重要,例如swap(int *x, int *y),这将非常方便。例子:

int x,y;
x=1;
y=1;
increment_both_coordinate(x,y);
//after this call, you want to have x = 2, y = 2

这只能使用类似的方法来实现swap(int *x, int *y)。这只是一个插图,当您将来看到它们时,您会明白这有多么有用。

于 2012-03-30T15:15:46.253 回答
1

在里面bubbleSort()你调用了一个名为的函数swap(),但是在代码中,没有swap()定义或声明的函数。

解决方案1:将swap()to的定义移到定义之前解决方案2:在定义之前bubbleSort()
指定原型swap()bubbleSort()

于 2012-03-30T14:29:38.327 回答
0

如果函数为 void,则不能返回数字。

改变你的

return 0;

return;
于 2012-03-30T14:19:48.837 回答
0

因为你返回 0。取出 return 语句,你应该没问题,特别是因为你操作的是指针而不是复制值。

于 2012-03-30T14:19:54.063 回答
0

使用“void”意味着函数不返回任何值,但实际上你的函数返回“0”,它是一个int类型。所以你应该在函数定义之前使用int而不是void。

于 2012-03-30T14:21:01.740 回答
0

这是一个交换整数的函数:

void swap(int *x, int *y) {
    *x = *x ^ *y;
    *y = *x ^ *y;
    *x = *x ^ *y;
}

int main(int argc, char* argv) {

    int a,b;

    a = 5;
    b = 10;
    swap(&a, &b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

您可以通过这种方式交换两个数组单元:swap(&arr[i], &arr[j]);

于 2012-03-30T15:16:43.537 回答