【问题标题】:qsort a double pointer pointing to an array of struct pointersqsort 一个指向结构指针数组的双指针
【发布时间】:2019-01-18 18:18:44
【问题描述】:

您好,我是学习 C 编程语言的新手,无法理解这个问题。我想对一个指向 struct[person] 指针数组的双指针进行 qsort 排序。我需要根据多个标准对结构指针进行排序。 (年龄按升序排列,姓名和身高均按降序排列)。我想知道我的语法在以下比较函数和 qsort 调用中是否正确。

    struct person {
        int age;
        float height;
        char name[20];
    };
    struct person **arr = malloc(sizeof(struct person)*10);
    ..... this part is just initialisation

    qsort(arr, 10,sizeof(struct person*), compareFunction);

    int compareFunction(const void *a, const void *b){
        struct person* p1 = (struct person*) a;
        struct person* p2 = (struct person*) b;

        if(p1 - >age > p2-> age){
            return 1;
        } else if (p1 -> age < p2 <-age){
            return -1;
        }
        if (strcmp(p1 - >name, p2 ->name)<0){
            return 1;
        } else if (strcmp(p1-> name , p2->name)>0){
            return -1;
        }
        if (p1 -> height < p2 ->height){
            return 1;
        } else if (p1 - > height > p2 ->height){
            return -1;
        }
        return 0;
    }

【问题讨论】:

  • struct person p1 = (struct person*) a; 不正确。您不能将指针隐式转换为非指针
  • 任何编译器都会告诉你你的语法是否正确。在这种情况下无需与人互动。
  • 发布您的 qsort 函数原型以及您如何声明 doubleoointer
  • 问题不完整,因为缺少代码的相关部分。虽然不可能给出一个严肃的答案。人们需要猜测,我不会做什么。
  • 我们至少需要知道doublePtr是如何定义和设置的。

标签: c qsort


【解决方案1】:

-> 用于通过结构指针访问结构成员。

structure_pointer->structure_member

对于结构变量,我们使用'.'运算符。

structure_variable.structure_member

您的 compareFunction 可以修改为

int compareFunction(const void *a, const void *b){
    if(a->age > b->age){
        return 1;
    } else if (a->age < b->age){
        return -1;
    }
    if (strcmp(a->name, b->name)<0){
        return 1;
    } else if (strcmp(a->name, b->name)>0){
        return -1;
    }
    if (a->height < b->height){
        return 1;
    } else if (a->height > b->height){
        return -1;
    }
    return 0;
}

【讨论】:

  • 不需要这些演员表。在 C 中,void-pointer 被隐式转换为/从任何其他指针类型转换。
  • 如果这些演员表不在那里,我将无法编译。
  • 我的错误我忘了用a替换p1和用b替换p2。由于我们不进行类型转换,我们不再需要 p1 和 p2
  • 如果没有这些转换,我将无法编译。”那么您很可能使用的是 C++ 编译器,而不是 C 编译器。
  • 我更新了没有p1和p2的代码。如果您只尝试使用新代码,您可以在此处粘贴您的错误吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
相关资源
最近更新 更多