簡體   English   中英

使用 qsort function 對結構進行排序

[英]using qsort function to sort a struct

所以我需要使用 qsort() 對包含結構的數組進行排序

#include <stdio.h>

// =========
struct pair
{
    int encounters;
};// pair{}

int compaireEncounters(const void*, const void*);

int main()
{
    struct pair* working[5];
    working[0]->encounters = 10;
    working[1]->encounters = 3;
    working[2]->encounters = 1;

    qsort(working, 5, sizeof(struct pair), compareEncounters);
    int i = 0;
    while (i < 3)
    {
        printf("%d \n", working[i]->encounters)
        i++;
    }

}

int compaireEncounters(const void* av, const void* bv)
{
    int a = ((struct pair*)av)->encounters;
    int b = ((struct pair*)bc)->encounters;
    return(a > b);
}

我正在嘗試獲取 output:

1 
3
10

但相反,我得到了一個分段錯誤核心轉儲。

這里有什么問題?

在取消引用指針之前,您必須將指針分配給有效緩沖區。

在這種情況下, working應該是結構數組,而不是指針數組。

也不要忘記初始化所有要排序的元素。

您的代碼中還有更多錯誤:

  • 使用qsort時不包括正確的 header ( stdlib.h )
  • 未聲明的compareEncounters用於main function。
  • printf()語句后缺少分號。
  • 未聲明的bc用於compaireEncounters function。

固定代碼:

#include <stdio.h>
#include <stdlib.h>

// =========
struct pair{
    int encounters;
};// pair{}

int compaireEncounters(const void* , const void*);

int main() {
    struct pair working[5];
    working[0].encounters = 10;
    working[1].encounters = 3;
    working[2].encounters = 1;
    working[3].encounters = 334;
    working[4].encounters = 42;

    qsort(working, 5, sizeof(struct pair), compaireEncounters);
    int i = 0;
    while (i < 3) {
        printf("%d \n", working[i].encounters);
        i++;
    }

}

int compaireEncounters(const void* av, const void* bv){
    int a = ((struct pair*)av)->encounters;
    int b = ((struct pair*)bv)->encounters;
    return(a > b);
}

如果要使用指針數組,

  • 在取消引用之前分配緩沖區並分配它們。
  • 修復qsort()的元素大小。
  • 修復compaireEncounters以比較指向結構的指針。
#include <stdio.h>
#include <stdlib.h>

// =========
struct pair{
    int encounters;
};// pair{}

int compaireEncounters(const void* , const void*);

int main() {
    struct pair* working[5];
    working[0] = malloc(sizeof(*working[0])); working[0]->encounters = 10;
    working[1] = malloc(sizeof(*working[1])); working[1]->encounters = 3;
    working[2] = malloc(sizeof(*working[2])); working[2]->encounters = 1;
    working[3] = malloc(sizeof(*working[3])); working[3]->encounters = 334;
    working[4] = malloc(sizeof(*working[4])); working[4]->encounters = 42;

    qsort(working, 5, sizeof(*working), compaireEncounters);
    int i = 0;
    while (i < 3) {
        printf("%d \n", working[i]->encounters);
        i++;
    }

}

int compaireEncounters(const void* av, const void* bv){
    int a = (*(struct pair**)av)->encounters;
    int b = (*(struct pair**)bv)->encounters;
    return(a > b);
}

暫無
暫無

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

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