簡體   English   中英

如何根據結構中的字段對結構數組進行排序? (在 C 中)

[英]How to sort an array of structures based on a field in the structures? (in C)

我有一個程序,將有關 10 所大學的各種信息存儲為數組中的結構。 我有一個名為“inputData”的 function,它通過將大學的信息轉換為結構來將它們加載到數組中。 我正在嘗試編寫一個 function,它將按學費(從最高到最低)對大學進行排序。 我嘗試使用選擇排序來執行此操作,但我一直在某個地方遇到錯誤。

這是結構:


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

這是 function 將信息轉換為結構:

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);

我正在嘗試使用此 function (使用選擇排序)進行排序:

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");
    }
};

這是交換 function:

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

我不斷得到:

姓名:Univceton 大學城市:普林斯頓 State:NJ 排名:1 學費:45320
姓名:弗吉尼亞城王子:夏洛茨維爾 State:弗吉尼亞州排名:24 學費:52040
姓名: Univon College City: Chestnut Hill State: MA 排名: 31 學費: 51296
姓名:波斯特賈理工學院城市:亞特蘭大 State:GA 排名:34 學費:32404
姓名:喬治大學城市:伯利恆 State:PA 排名:44 學費:48320
姓名:芝加哥市議會:芝加哥 State:IL 排名:3 學費:52491
姓名:杜克大學城市:達勒姆 State:NC 排名:8 學費:51265
名稱:喬治亞大學城市:雅典 State:GA 排名:56 學費:29844
姓名:丹佛市大學:Denver State:CO 排名:86 學費:46362
名稱:芝加哥洛約拉大學城市:芝加哥 State:IL 排名:99 學費:26270

我不明白為什么名稱會損壞以及為什么排序不起作用? 我認為這是因為修改后的列表沒有存儲在任何地方,但我不知道如何解決這個問題。 任何幫助,將不勝感激。 謝謝你

你交換 function 應該是

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

這給出了預期的 output:

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

筆記

這是一種效率極低的排序。 沒有人會在生產代碼中這樣做。

正如David Cullen在他們的回答中寫到的關於swap() function 的那樣,根據tuition交換結構的swap() function 將是:

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

你的printSortedUniversity() function 應該是這樣的:

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;
        if(i != max_idx)
            swap(&list[max_idx], &list[i]);
    }

    for (i=0; i<10; i++){
        printInfo(list[i]);
        // printf("%d\n",list[i].tuition);
        printf("\n");
    }
}

這對我有用:

使用此交換 function:

void swap(struct University *p, struct University *q)  //function to swap list items
{ 
    struct University hold = *p; 
    *p = *q; 
    *q = hold; 
}

而且我沒有更改 printSortedUniversity function:

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");
}

};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM