【发布时间】: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