首页 > 解决方案 > 如何根据结构中的字段对结构数组进行排序?(在 C 中)

问题描述

我有一个程序,将有关 10 所大学的各种信息存储为数组中的结构。我有一个名为“inputData”的函数,它通过将大学的信息转换为结构来将它们加载到数组中。我正在尝试编写一个按学费(从最高到最低)对大学进行排序的函数。我尝试使用选择排序来执行此操作,但我一直在某个地方遇到错误。

这是结构:


struct University
{
    char name[50];
    char city[20];
    char state[3];
    int rank;
    int tuition;
};

这是将信息转换为结构的函数:

struct University inputData(char Name[50], char City[20], char State[3], int Rank, int Tuition){
    struct University uni;
    strcpy(uni.name, Name);
    strcpy(uni.city, City);
    strcpy(uni.state, State);
    uni.rank=Rank;
    uni.tuition=Tuition;
    return uni;
};

然后我创建了一个结构数组并添加了所有信息:

struct University university[10];
university[0]= inputData("Princeton University", "Princeton", "NJ", 1, 45320);
university[1]= inputData("University of Virginia", "Charlottesville", "VA", 24, 52040);
university[2]= inputData("Boston College", "Chestnut Hill", "MA", 31, 51296);
university[3]= inputData("Georgia Institute of Technology", "Atlanta", "GA", 34, 32404);
university[4]= inputData("Lehigh University", "Bethlehem", "PA", 44, 48320);
university[5]= inputData("University of Chicago", "Chicago", "IL", 3, 52491);
university[6]= inputData("Duke University", "Durham", "NC", 8, 51265);
university[7]= inputData("University of Georgia", "Athens", "GA", 56, 29844);
university[8]= inputData("University of Denver", "Denver", "CO", 86, 46362);
university[9]= inputData("Loyola University Chicago", "Chicago", "IL", 99, 26270);

我正在尝试使用此功能(使用选择排序)进行排序:

void printSortedUniversity(struct University* list){
    int i, j, max_idx; 
  
      for (i = 0; i < 9; i++) 
    { 
        max_idx = i; 
        for (j = i+1; j < 10; j++) 
          if (list[j].tuition > list[max_idx].tuition) 
            max_idx = j; 
  
        swap(&list[max_idx], &list[i]); 
    } 
    
    for (i=0; i<10; i++){
        printInfo(list[i]);
        printf("\n");
    }
};

这是交换功能:

void swap(int *x, int *y) 
{ 
    int temp = *x; 
    *x = *y; 
    *y = temp; 
} 

我不断得到:

名称:Univceton 大学城:普林斯顿州:NJ 排名:1 学费:45320
名称:弗吉尼亚公主城:夏洛茨维尔州:VA 排名:24 学费:52040
名称:Univon 大学城:栗子山州:MA 排名:31 学费:51296
名称:波斯特贾理工学院 城市:亚特兰大州:GA 排名:34 学费:32404
名称:乔治大学城:伯利恒州:宾夕法尼亚州 排名:44 学费:48320
名称:芝加哥 Lehiersity 市:芝加哥州:伊利诺伊州 排名:3 学费: 52491
名称:杜克大学城市:达勒姆州:北卡罗来纳州排名:8 学费:51265
名称:乔治亚大学城市:雅典州:GA 排名:56 学费:29844
名称:丹佛市大学:丹佛州:CO 排名:86 学费:46362
名称:芝加哥洛约拉大学 市:芝加哥州:IL 排名:99 学费:26270

我不明白为什么名称会损坏以及为什么排序不起作用?我认为这是因为修改后的列表没有存储在任何地方,但我不知道如何解决这个问题。任何帮助,将不胜感激。谢谢你

标签: csortingselection-sort

解决方案


你交换功能应该是

void swap(struct University *x, struct University *y) 
{ 
    struct University temp = *x; 
    *x = *y; 
    *y = temp; 
} 

这给出了预期的输出:

Name: University of Chicago City: Chicago Rank: 3 Tuition: 52491
Name: University of Virginia City: Charlottesville Rank: 24 Tuition: 52040
Name: Boston College City: Chestnut Hill Rank: 31 Tuition: 51296
Name: Duke University City: Durham Rank: 8 Tuition: 51265
Name: Lehigh University City: Bethlehem Rank: 44 Tuition: 48320
Name: University of Denver City: Denver Rank: 86 Tuition: 46362
Name: Princeton University City: Princeton Rank: 1 Tuition: 45320
Name: Georgia Institute of Technology City: Atlanta Rank: 34 Tuition: 32404
Name: University of Georgia City: Athens Rank: 56 Tuition: 29844
Name: Loyola University Chicago City: Chicago Rank: 99 Tuition: 26270

笔记

这是一种效率极低的排序。没有人会在生产代码中这样做。


推荐阅读