繁体   English   中英

如何在没有 qsort() 的情况下使用指针(不是数组索引)对数组或结构进行排序?

[英]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,但如果您需要自己实现排序,这里是您需要采取的步骤的粗略细分,而不会给您整个实现。


杂项错误

  • 您的数组名为“stu”,但您正尝试使用名称“st”访问它。 您的编译器应该立即警告您(如果您甚至试图编译它)这个问题。
  • 您正在尝试通过使用“->”取消引用结构来访问学生元素。 您的数组存储学生,而不是堆分配的学生 *,因此您需要使用“。”访问运算符,或 malloc 数组中的每个学生。
  • drescherjm 还指出了您的 printf(printf( 错误
  • 就个人而言,我喜欢“typedef”我的结构,但你不必这样做。

交换

首先,交换 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM