将qsort()与Structs结合使用 [英] Using qsort() with Structs

查看:53
本文介绍了将qsort()与Structs结合使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚开始学习C,但我仍然是新手.在此程序中,我正在处理一系列结构.结构是:

I just started learning C and I'm still new to it. In this program I'm working with an array of structs. The structs are:

typedef struct {
    int day;
    int month;
    int year;
} Date;

typedef struct {
    int serial_num;
    char full_name[15];
    Date *pDate;
} Person;

该数组是 Person * people .

现在我有两个人数组和这些人的出生日期(相同的索引):

Now I have two arrays of people and birth dates of those people (same indexes):

const char* names[MAX] = { "Sasson_Sassoni", "Pooh", "James_Bond", "Elvis_is_Alive", "Shilgiya", "Cleopatra", "Sissoo_VeSimmhoo" };

const int dates[MAX][COLS] = {
        { 10, 1, 1988 },
        { 12, 12, 1948 },
        { 4, 12, 1970 },
        { 11, 11, 1890 },
        { 11, 11, 1948 },
        { 1, 10, 1213 },
        { 12, 11, 1948 }
    };

通过使用 switch case ,每次用户键入1时,会将列表中的一个人(姓名和生日)添加到列表 people 中.然后,如果用户键入3,则列表 people 应该按日期排序(从最早到最小).所以我写了以下两个函数:

By using switch case, every time the user types 1 a person from the lists (Name and birthday) is added to the list people. Then if the user types 3, the list people should be sorted by date (oldest to youngest). So I wrote the following two functions:

void sortList(Person **people, int index) {
    qsort(*people, index, sizeof(Person), intcmp);
}
int intcmp(const void *a, const void *b) {
    Person *one = (Person *)a;
    Person *two = (Person *)b;
    int year1 = one->pDate->year;
    int year2 = two->pDate->year;
    int month1 = one->pDate->month;
    int month2 = two->pDate->month;
    int day1 = one->pDate->day;
    int day2 = two->pDate->day;
    if (year1 > year2)
        return -1;
    else if (year2 > year1)
        return 1;
    if (month1 > month2)
        return -1;
    else if (month2 > month1)
        return 1;
    if (day1 > day2)
        return -1;
    else if (day2 > day1)
        return 1;
    return 0;
}

但是每次我收到一条错误消息:

But every time I get an error saying:

Exception thrown: read access violation.
one->pDate was nullptr.

有帮助吗?谢谢!

进一步说明:为了将人物一一插入到数组中,我创建了一个名为index的变量,每增加一个人物,索引就会增加一.因此,当调用函数qsort()时, index 是数组中的人数.还有 MAX = 7,COLS = 3,LEN = 10 .将人添加到数组的函数是:

Further explanation: In order to insert the people to the array one by one, I made a variable called index and every time a person is added the index grows by one. So When calling the function qsort(), index is the number of people in the array. Also MAX=7, COLS=3, LEN=10. The function that adds people to the array is:

void addToList(Person **people, int *index, const char *names[MAX], const int dates[][COLS]) {
    people[*index] = (Person *)malloc(sizeof(Person));
    people[*index]->serial_num = *index + 1;
    strcpy(people[*index]->full_name, names[*index]);
    Date *temp = (Date *)malloc(sizeof(Date));
    temp->day = dates[*index][0];
    temp->month = dates[*index][1];
    temp->year = dates[*index][2];
    people[*index]->pDate = temp;
    printf("%d %s     %d/%d/%d \n", people[*index]->serial_num, people[*index]->full_name, people[*index]->pDate->day, people[*index]->pDate->month, people[*index]->pDate->year);
    *index = *index + 1;
}

推荐答案

您的mcve不完整,但我认为这是因为您混淆了指针和结构:

Your mcve is not complete but I think it's because you confuse pointer and struct:

void sortList(Person **people, int index) {
    qsort(people, index, sizeof(Person *), intcmp);
    // or qsort(people, index, sizeof *people, intcmp);
}

int intcmp(const void *a, const void *b) {
    const Person *one = *(const Person **)a;
    const Person *two = *(const Person **)b;

这篇关于将qsort()与Structs结合使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆