交换功能c

时间:2012-03-30 14:17:08

标签: c swap bubble-sort

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

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

当我试图运行时,我收到以下错误: 警告C4013:'swap'undefined;假设extern返回int 错误C2371:'swap':重新定义;不同的基本类型\

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

谢谢大家!

编辑:对不起'返回0'只有在我把这个函数变成一个int之后才会出现,我不需要原型,因为它在主函数之前......我呢?

以下是整个代码:

//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");
    }

7 个答案:

答案 0 :(得分:2)

你似乎缺乏适合该功能的原型。

添加

void swap(int arr[], int size, int i, int j);
在第一次通话之前

此外,使用这种以指针为中心的表示法进行索引并没有什么意义,尤其是因为您将arr参数声明为数组而引起的混淆。使用起来更干净:

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

请注意const使用temp值,因为它在分配后不会改变。在三线功能中没什么大不了的,但这是一个好习惯。

答案 1 :(得分:1)

原始问题包含所有代码后编辑

bubbleSort()内部调用名为swap()的函数,但是在代码中的那一点,没有定义或声明名为swap()的函数。

解决方案1:将swap()的定义移至bubbleSort()的定义之前 解决方案2:在定义swap()

之前指定bubbleSort()的原型

显然

  

错误C2371:'swap':重新定义;不同的基本类型

在您定义自己的范围时,范围内还有另一个swap函数。

也许this one

答案 2 :(得分:1)

您需要在void swap(int arr[], int i, int j)之上放置void bubbleSort(),因为您在swap()内使用bubbleSort()

如果不是,您将遇到C的隐式声明,即在main()中,您正在呼叫bubbleSort(),而bubbleSort()将呼叫swap(),但此时,bubbleSort()不知道您swap()的声明,因为它在它下方声明。所以,编译器理解的是你正在调用swap() 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)的方法来实现。这只是一个例子,您将了解将来看到它们时的有用性。

答案 3 :(得分:0)

如果该功能无效,则无法返回数字。

更改您的

return 0;

return;

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分: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]);