【问题标题】:Implement a bubble sort for an array of structs为结构数组实现冒泡排序
【发布时间】:2018-11-27 19:21:39
【问题描述】:

我正在尝试对结构数组进行排序,但无法正确排序数组。我尝试过使用指针算术、memcpy 和数组表示法进行排序。有正确的方法吗? 结果只是复制到所有这些上的第一条记录。

void bubblesort(struct Record *ptr, int records,
        int (*fcomp)(const void *, const void *))
{
        int swapped;
        int i = 0;
        struct Record *tmp;
        struct Record *tmp1;
        do {
                swapped =0;
                for(i=0;i<records-1;i++){
                        if(fcomp(ptr+i,ptr+i+1)>0){
                                swapped = 1;
                                tmp = ptr+i;
                        /*      tmp1 = ptr+i+1;
                                ptr[i]= *tmp1;
                                ptr[i+1] = *tmp;
                                */
                        //      tmp->seqnum = ptr[i].seqnum;
                        //      tmp->threat = ptr[i].threat;
                        //      tmp->addrs[0] = ptr[i].addrs[0];
                        //      tmp->addrs[1] = ptr[i].addrs[1];
                        //      tmp->ports[0] = ptr[i].ports[0];
                        //      tmp->ports[1] = ptr[i].ports[1];
                        //      strcpy(tmp->dns_name,ptr[i].dns_name);
                                ptr[i].seqnum = ptr[i+1].seqnum;
                                ptr[i].threat = ptr[i+1].threat;
                                ptr[i].addrs[0] = ptr[i+1].addrs[0];
                                ptr[i].ports[0] = ptr[i+1].ports[0];
                                ptr[i].addrs[1] = ptr[i+1].addrs[1];
                                ptr[i].ports[1] = ptr[i+1].ports[1];
                                strcpy(ptr[i].dns_name ,ptr[i+1].dns_name);

                                ptr[i+1].seqnum = tmp->seqnum;
                                ptr[i+1].threat = tmp->threat;
                                ptr[i+1].addrs[0] = tmp->addrs[0];
                                ptr[i+1].ports[0] = tmp->ports[0];
                                ptr[i+1].addrs[1] = tmp->addrs[1];
                                ptr[i+1].ports[1] = tmp->ports[1];
                                strcpy(ptr[i+1].dns_name,tmp->dns_name);


                        }
                }
        }
`

【问题讨论】:

  • 告诉我们你的最佳猜测,我们会给你反馈
  • 我们不是读心术的人。 不可能告诉你你的代码有什么问题,除非我们可以看到它,以及明确说明的目标(似乎我们拥有最多;你想要冒泡排序一系列结构)、预期行为、实际行为,以及您已经完成的任何调试工作以及您从上述内容中得出的结论。请edit your question 提供所有上述要求的信息。
  • 写一个比较函数,写一个交换函数,写一个气泡函数来根据需要调用另外两个?如果您在其中一个步骤中遇到问题,并且在自己完全调试后,发布一个新问题?
  • 我猜你的实现都很好。如果您尝试了不同的语法,但都没有成功,这可能表明代码的另一部分存在错误。告诉我们minimal reproducible example,我敢打赌有人会很快找到问题。
  • 你需要学会使用结构赋值;这将使交换更加方便。 struct Record tmp = ptr[i]; ptr[i] = ptr[i + 1]; ptr[i + 1] = tmp; 应该可以解决问题。请注意,临时值是一个结构,而不是指向结构的指针。

标签: c systems-programming


【解决方案1】:

您应该使用结构赋值,因为它们比结构中每个元素的重复赋值要紧凑得多。像这样:

struct Record
{
    int seqnum;
    int threat;
    int addrs[2];
    int ports[2];
    char dns_name[32];
};

void bubblesort(struct Record *ptr, int records,
                int (*fcomp)(const void *, const void *))
{
    int swapped;
    do
    {
        swapped = 0;
        for (int i = 0; i < records - 1; i++)
        {
            if (fcomp(ptr + i, ptr + i + 1) > 0)
            {
                swapped = 1;
                struct Record tmp = ptr[i];
                ptr[i] = ptr[i + 1];
                ptr[i + 1] = tmp;
            }
        }
    } while (swapped != 0);
}

请注意,在这段代码中,临时值tmp 是一个结构,而不是一个指向结构的指针。

您还省略了问题代码中的 while (swapped != 0); 条件和结尾的 }。我已经通过推理把它们放进去了。该代码编译。我没有运行它——我只是将交换代码从 21 行左右减少到 3 行。

【讨论】:

  • 感谢您解决了这个问题。你能解释一下为什么我之前的做法导致代码在每个记录结构中存储相同的值吗?
  • 您的 tmp 是指向 struct Record 的指针,并且您将其指向 ptr[i](您将其设置为 ptr + i,又名 &amp;ptr[i]。但您没有复制数据;您只需指向保存ptr[i] 的内存。然后您从ptr[i+1]ptr[i] 进行数据的分段复制(巧合的是,这意味着tmp 现在指向数据的副本那是在ptr[i+1])。[…继续…]
  • [...continuation...] 然后分配tmp 指向的数据超过ptr[i+1],这对于自@987654337 以来的值变化而言是无操作的@ 指向 ptr[i+1] 中内容的副本。所以现在你有两个相邻的行包含 ptr[i+1] 中的内容,而没有包含 ptr[i] 中的内容。这不是我们想要的。
  • 好的,谢谢你,因为我。我仍在学习如何正确使用结构指针。
猜你喜欢
  • 1970-01-01
  • 2020-06-24
  • 2012-07-23
  • 2017-01-24
  • 2017-03-11
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
相关资源
最近更新 更多