【问题标题】:how to use sorting indices to sort integers from a structure array in c?如何使用排序索引对c中结构数组中的整数进行排序?
【发布时间】:2019-02-09 04:12:50
【问题描述】:

我正在尝试编写一个函数,询问用户要排序的结构元素,然后打印排序列表。我正在使用单独的数组(排序索引)对元素进行排序而不改变结构本身,但无法获得对元素进行实际排序的函数。我正在使用嵌套的 for 循环进行排序。

typedef struct  {
    unsigned long term;
    unsigned long id_num;
    char dept[5];
    int crs_num;
} crsinfo_t;

int main(void)
{
    int i;
    crsinfo_t info[50];
    i = 50;
    /* I read the info in from a file but just didn't include that bit*/
    sort(i, info);

    return(0);
}


void sort(int i, crsinfo_t info[50])
{
    int sorter[50];
    int holder = 0;
    int f, j, k, m, n;

    for (f=0; f<=i; f++){
        sorter[f] = f;
    }

    for (j = 0; j < i; j++) {
        for (k = j+1; k < i; k++) {
            if (info[j].term <= info[k].term) {
                holder = sorter[j];
                sorter[j] = sorter[k];
                sorter[k] = holder;
            }
        }
    }

    for (m=0; m<i; m++)
    {
        printf("%lu %lu %s %2d \n", info[sorter[m]].term), 
        info[sorter[m]].id_num, info[sorter[m]].dept, 
        info[sorter[m]].crs_num}
    }
}

它应该以升序打印基于term 排序的所有元素的列表,但数字仍然是随机组织的(尽管与原始文件不同)。

【问题讨论】:

  • 由于f&lt;=i,您的程序最终会访问超出其大小的sorter 数组 - sorter[f]

标签: c


【解决方案1】:

它应该打印所有元素的列表,其中术语按升序排序......

虽然,您的代码的核心逻辑是正确的,但由于此语句中的&lt;=,它将按降序而不是升序排序:

if (info[j].term <= info[k].term) {
                 ^^

如果要按升序排序,请使用&gt; 运算符。

在这个循环中,

for (f=0; f<=i; f++){
    sorter[f] = f;
}

您的程序正在访问数组sorter 超出其限制。 sorter 数组的大小是50,索引从049,并且由于循环条件f&lt;=i 它最终访问了超出数组大小的sorter[50]

查看最后一个循环中的printf(...

for (m=0; m<i; m++)
   { printf("%lu %lu %s %2d \n", info[sorter[m]].term), 
     info[sorter[m]].id_num, info[sorter[m]].dept, 
   info[sorter[m]].crs_num}

编译器不是在这个语句上给出错误吗? ) 放置错误。此外,printf 语句末尾没有分号。

应该是:

for (m=0; m<i; m++)
{ 
    printf("%lu %lu %s %2d \n", info[sorter[m]].term, 
                                info[sorter[m]].id_num, 
                                info[sorter[m]].dept, 
                                info[sorter[m]].crs_num);
}

采用5硬编码值crsinfo_t结构的示例代码:

#include <stdio.h>

typedef struct {
        unsigned long term;
        unsigned long id_num;
        char dept[5];
        int crs_num;
} crsinfo_t;

void sort(int i, crsinfo_t info[5]);

int main(void) {
        int i;
        crsinfo_t info[5] = {{4, 2, "abc", 7}, {5, 2, "def", 9}, {8, 0, "ghi", 9}, {3, 8, "jkl", 4}, {1, 3, "mno", 4}};
        i = 5;
        sort(i, info);
        return 0;
}

void sort(int i, crsinfo_t info[5]) {
        int sorter[5];
        int holder = 0;
        int f, j, k, m;

        for (f = 0; f < i; f++){
                sorter[f] = f;
        }

        for (j = 0; j < i; j++) {
                for (k = j + 1; k < i; k++) {
                        if (info[j].term > info[k].term) {
                                holder = sorter[j];
                                sorter[j] = sorter[k];
                                sorter[k] = holder;
                        }
                }
        }

        for (m = 0; m < i; m++) {
                printf("%lu %lu %s %2d \n", info[sorter[m]].term,
                                                info[sorter[m]].id_num,
                                                info[sorter[m]].dept,
                                                info[sorter[m]].crs_num);
        }
}

输出:
根据结构体crsinfo_tterm成员升序排序。

#  ./a.out
1 3 mno  4 
3 8 jkl  4 
4 2 abc  7 
5 2 def  9 
8 0 ghi  9 

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2014-03-12
    • 2016-07-14
    相关资源
    最近更新 更多