[英]How to sort array or structure using pointers (not array index) without qsort()?
我试过 void BubbleSort,但效果不佳。 您知道如何使用指针并基于 mark_lab 值对数组进行排序吗? 所以首先应该是具有最高 mark_lab 值的元素。
通常我在第一个 for() 的 if 语句中收到错误,但它似乎是正确的。
#include <stdlib.h>
#include <string.h>
struct student{
char name [20];
char surname [20];
char id_num [10];
int mark_lab;
int mark_test;
};
int main(){
int i;
struct student st[]={
{"AA", "Pu", "1C666", 8, 9},
{"RR", "Ab","4DC33",5,7},
{"AA", "Z","24C25", 10, 6},
{"KK", "Oz","161RD", 9,10},
{"EE", "Pre", "DC902", 7,8}
};
//to sort the array
for (i=0;i<4;i++){
if (stu[3]->mark_lab<stu[i]->mark_lab){
stu[3]->name=stu[i]->name;
stu[3]->surname=stu[i]->surname;
stu[3]->id_num=stu[i]->surname;
stu[3]->mark_lab=stu[i]->mark_lab;
stu[3]->mark_test=stu[i]->mark_lab;
stu[i]->name=stu[i+1]->name;
stu[i]->surname=stu[i+1]->surname;
stu[i]->id_num=stu[i+1]->surname;
stu[i]->mark_lab=stu[i+1]->mark_lab;
stu[i]->mark_test=stu[i+1]->mark_lab;
stu[i+1]->name=stu[3]->name;
stu[i+1]->surname=stu[3]->surname;
stu[i+1]->id_num=stu[3]->surname;
stu[i+1]->mark_lab=stu[3]->mark_lab;
stu[i+1]->mark_test=stu[3]->mark_lab;
}
}
//to print it on the screen
for (i=0;i<4;i++){
printf (printf("\nName: %s, Surname: %s, ID: %s, Lab_Mark: %d, Test Mark: %d",
stu[i]->name, stu[i]->surname,stu[i]->id_num, stu[i]->mark_lab,stu[i]->mark_test);
}
return 0;
}
这里发生了很多事情,所以让我们在不直接向您提供答案的情况下分解出什么是错的以及该怎么做。 “最简单”的解决方案是 sweenish 建议使用 std::sort 和比较 function,但如果您需要自己实现排序,这里是您需要采取的步骤的粗略细分,而不会给您整个实现。
杂项错误
交换
首先,交换 function 将使您的生活更轻松。 我们可以简单地使用两个元素的数组和索引进行交换。 简单的方法是使用临时变量,尽管您也可以使用 XOR 交换(它有自己的警告)。 请记住,当使用 function 修改数组时,我们需要通过引用传递数组,因为数组存储在 main() 的堆栈框架中,并且我们希望我们的函数更改保持不变,所以我们必须通过数组传递参考。 有关这方面的更多信息,请参见此处。 您的交换 function 应该看起来像这样。
void swap(struct *students[], int idx_a, int idx_b) {
struct student temp = *students[idx_a];
*students[idx_a] = *students[idx_b];
*students[idx_b] = temp;
}
我注意到您还将 struct id_num's 设置为姓氏。 如果这是您实际上应该做的事情,您还需要在此交换 function 中考虑这一点。
排序
您将使用您的交换 function 来实现排序。 您说您使用的是冒泡排序,所以这是可能看起来的伪代码。 请记住,您进行了反向排序(最大优先),因此您的比较需要从正常的冒泡排序实现中“翻转”。
for (i = 0; i < 4; i++) {
for ( j = 0; j < 4 - i - 1; j++) {
if (st[j].mark_lab < st[j+1].mark_lab)
swap(&st, j, j+1);
}
}
这应该能让你大部分时间到达那里。 将来,我强烈建议在尝试调试或进入 stackoverflow 之前编译此代码,因为编译器比你我聪明得多,并且会为你遇到的许多错误提供描述性解释。 尝试使用 'gcc -o [executable_name] [your_program.c]' 进行编译。 当您清理编译时错误时,您可以使用 ./[executable_name] 运行以尝试诊断您可能遇到的任何运行时错误。
总的来说,我建议巩固你对 C 语法的理解,以及指针和结构如何工作的基础知识。 当您发现自己编写了许多冗余代码行时,例如 for 循环的大部分主体,请停止编码。 重新评估你到底想要做什么,并尝试找到一种更清洁的方法来做这件事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.