【问题标题】:Selection sort using pointers C with a structure使用带有结构的指针 C 进行选择排序
【发布时间】:2014-06-14 15:39:45
【问题描述】:

我省略了 main 但基本上这应该对 8 个元素进行排序,但是当我编译它时,它说:

prelab3.c: In function ‘sort’:
prelab3.c:77: error: invalid operands to binary > (have ‘DynamicArray’ and ‘DynamicArray’)

我不确定为什么,你不能用指针比较结构中的东西吗?

代码如下:

    typedef struct Array_
        {
            int data;
    }DynamicArray;


    void sort(DynamicArray *v, unsigned int size)
    {
        int i, j;
        int min;
        DynamicArray temp;
        for (i=0; i<size-1; i++)
        {
            min = i;
            for(j=i+1; j<size; j++)
            {
                if(*(v+i) > *(v+j))
                {
                    min = j;
                }
            }
            if(min != i)
            {
                temp = *v;
                *v = *(v+min);
                *(v+min) = temp;
            }
        }
    }

【问题讨论】:

    标签: c sorting struct selection


    【解决方案1】:

    比较结构是没有意义的,但你可以比较其中的整数。试试这个:

    (v+i)->data > (v+j)->data
    

    【讨论】:

    • 是的,现在它可以编译了!谢谢!现在我必须弄清楚逻辑,它没有正确排序。
    【解决方案2】:

    正如@David 所说,您无法比较结构。你的算法也有一些错误:

    • j 循环旨在找到 [i,size) 范围内的最小项目,因此您的比较必须与迄今为止找到的最小值进行比较:

      (v+min)->data > (v+j)->data
      

      我建议你使用数组表示法,在我看来更清楚:

      v[min].data > v[j].data
      
    • 最后一部分(在 min != i 比较之后)旨在交换 min 和 i 位置之间的值,因此您的代码应如下所示:

      temp = v[i];
      v[i] = v[min];
      v[min] = temp;
      

    最后,请记住,结构分配并不总是有效,对于比您的结构更复杂的结构,您可能需要逐个字段分配或 memcpy()。

    【讨论】:

    • 我不确定你是否可以使用 v[min].data 和 v 作为指针...认为你必须使用 -> 而不是像 (v+min)->data。
    • @Survaf93 C 下标运算符 [] 旨在与任何非空指针表达式一起使用。数组变量只是数组名称是常量指针的一种特殊情况。
    • 我错了我把点'.',认为你需要有 v[min]->data 而不是 v[min].data
    • 好的。使用 v[min] 时,结果是最小位置的内容,而不是该元素的地址,这就是我使用点代替 -> 的原因。一个更简单的整数数组示例,A[i] 给你 A 的第 i 个位置的整数值,但是 (A+i) 给你这个元素的地址,所以你必须使用 *(A+i ) 来获取整数值。
    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 2012-09-26
    • 2020-03-15
    • 1970-01-01
    • 2023-03-19
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多