我如何按C中的字符对结构进行排序?

Fearless_Wolf

我使用该策略按数字对结构进行排序,但是此策略不起作用。

#include <stdio.h>
#define MAX 1000

typedef struct person_{
    char name[100];
    int age;
}person;

void scan_person(person *ptr);
void print_ind(person p);

int name_index_min(person *ptr, int N, int st);

void swap(person *x, person *y);

void sort_name_as(person *ptr, int N);
void sort_name_ds(person *ptr, int N);

int main () {
    person individulas[MAX];
    int n_ind;

    puts("Enter Number of people:");
    scanf("%d",&n_ind);
    for (int i = 0; i < n_ind; i++)
        scan_person(individulas + i);

    printf("\n");

    sort_name_as(individulas,n_ind);
    for (int i = 0; i < n_ind; i++)
        print_ind(individulas[i]); 

    puts("\n");

    sort_name_ds(individulas,n_ind);
    for (int i = 0; i < n_ind; i++)
        print_ind(individulas[i]);   

    printf("\n"); 
      return 0;
}   

void scan_person(person *ptr){

    printf("\nEnter Name & Surename :");
    scanf("\n%99[^\n]", ptr->name);

    printf("Enter Age :");
    scanf ("%d%*c", &(ptr->age));
    printf("\n");
}
void print_ind(person p){
    printf("%s %d  ", p.name, p.age);
}
int name_index_min(person *ptr, int N, int st){

    int min = st;
    for (int i = st+1; i < N; i++)
        if(ptr[i].name < ptr[min].name)
            min = i;
    return min;
}
int name_index_max(person *ptr, int N, int st){

    int max = st;
    for (int i = st+1; i < N; i++)
        if(ptr[i].name > ptr[max].name)
            max = i;
    return max;
}

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

void sort_name_as(person *ptr, int N){
    int aux;
    for (int i = 0; i < N-1; i++){
        aux = name_index_min(ptr, N, i);
        if (aux != i)
            swap(ptr + i, ptr + aux);
    }
}

void sort_name_ds(person *ptr, int N){
    int aux;
    for (int i = 0; i < N-1; i++){
        aux = name_index_max(ptr, N, i);
        if (aux != i)
            swap(ptr + i, ptr + aux);
    }
}

这是示例:

输入:

输入人数:3

输入姓名和名字:Jeffrey L.Davis
输入年龄:80

输入姓名和名称:Yaseen Nur al Din Khoury
输入年龄:80

输入姓名和名字:Joeri Ong
输入年龄:80

输出:

Joeri Ong 80 Jeffrey L.Davis 80 Yaseen Nur al Din Khoury 80 //升序

Yaseen Nur al Din Khoury 80 Jeffrey L.Davis 80 Joeri Ong 80 //降序

大卫·兰金

每当您遇到C语言中的排序问题时,您都应该立即思考qsort它是一种高效灵活的分类功能,可以处理需要分类的任何类型的对象。通常让新的C程序员感到害怕的是,您必须编写一个compare()函数来告诉您qsort如何比较和排序数组中元素的两个指针compare函数的原型是:

int compare (const void *a, const void *b)

所有ab指针都是指向当前正在比较的数组中两个元素的指针。您唯一的工作是将它们转换为正确的类型,然后告诉qsort您如何比较它们。让我们看一下您的第一个函数,先比较升序age,然后如果年龄相等,然后比较名称,以便所有具有相同年龄的患者按字母顺序排序,从原型开始:

int compasc (const void *a, const void *b)      /* qsort compare ascending by age */
{

不知道您的数组元素是什么类型(stuct person此处),所以a并且b将是指针 类型struct person您的工作仅是强制转换指针ab键入person*,例如

    const person *pa = a, *pb = b;

因此,没有void *指针ab,您有了person*指针papb在函数中使用。如果年龄不同,则比较年龄并返回,例如

    if (pa->age != pb->age)
        return (pa->age > pb->age) - (pa->age < pb->age);

否则,年龄是相等的,因此您可以按进行比较name,例如

    return (strcmp (pa->name, pb->name));
}

就是您的比较功能需要的功能。全部将是:

int compasc (const void *a, const void *b)      /* qsort compare ascending by age */
{
    const person *pa = a, *pb = b;

    if (pa->age != pb->age)
        return (pa->age > pb->age) - (pa->age < pb->age);

    return (strcmp (pa->name, pb->name));
}

按年龄进行降序比较的操作与进行比较的操作相同,否则age将导致按年龄降序排序。无论如何,如果年龄相等,则按名称按字母顺序排序。

您很好地定义了struct person要在数组中使用的最大数量的常数,但是您也可以为的大小声明一个常数name,例如

#define MAXNM  100
#define MAXP  1000

typedef struct person {
    char name[MAXNM];
    int age;
} person;

注意:'_'person_由于POSIX对保留以下划线开头/结尾的名称很挑剔因此已从中删除,并且您的struct标记typdef名称不需要相同)

在中main(),最好使用诸如fgets()POSIX之类的面向行的输入功能来一次读取用户输入getline()这样可以确保不会遗漏任何多余的字符,stdin这些字符可能会在下次尝试读取时咬住您。因此,只需声明一个简单的字符数组buf即可用作缓冲区来容纳所有输入行。然后,您可以从sscanf()处理任何转换的行中获得所需的信息要读取和存储阵列中的所有数据,可以执行以下操作:

int main (void) {

    int n_ind = 0;
    person individuals[MAXP] = {{ .name = "" }};

    while (n_ind < MAXP) {
        char buf[MAXP] = "";                /* buffer to hold line of input */
        person tmp = { .name = "" };        /* temporary struct to fill */

        fputs ("\nenter name & surname: ", stdout);
        if (!fgets (buf, MAXNM, stdin))
            return 1;
        if (*buf == '\n')
            break;

        buf[strcspn (buf, "\n")] = 0;       /* trim trailing '\n' */
        strcpy (tmp.name, buf);

        fputs ("enter age: ", stdout);
        if (!fgets (buf, MAXP, stdin))
            return 1;
        if (sscanf (buf, "%d", &tmp.age) == 1)  /* validate age conversion */
            individuals[n_ind++] = tmp;         /* add tmp to array update n_ind */
    }

注意: fgets()还使您能够检查第一个字符是否为'\n'-允许您Entername提示符处单独使用一个字符指示用户已完成输入操作-您无需让他们键入多少个字符将会输入。您只需继续添加名称,直到用户Entername提示时单独按下即可。)

现在,排序变得无关紧要qsort,只需传递您的数组,元素数,每个元素的大小以及您要qsort使用的compare函数,剩下的就完成了,例如

    qsort (individuals, n_ind, sizeof *individuals, compasc);   /* sort ascending */

这样就可以按年龄升序了-您的individuals数组现在按年龄然后按名称排序。

将其与升序和降序都放在一起:

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

#define MAXNM  100
#define MAXP  1000

typedef struct person {
    char name[MAXNM];
    int age;
} person;

int compasc (const void *a, const void *b)      /* qsort compare ascending by age */
{
    const person *pa = a, *pb = b;

    if (pa->age != pb->age)
        return (pa->age > pb->age) - (pa->age < pb->age);

    return (strcmp (pa->name, pb->name));
}

int compdesc (const void *a, const void *b)     /* qsort compare descending by age */
{
    const person *pa = a, *pb = b;

    if (pa->age != pb->age)
        return (pa->age < pb->age) - (pa->age > pb->age);

    return (strcmp (pa->name, pb->name));
}

int main (void) {

    int n_ind = 0;
    person individuals[MAXP] = {{ .name = "" }};

    while (n_ind < MAXP) {
        char buf[MAXP] = "";                /* buffer to hold line of input */
        person tmp = { .name = "" };        /* temporary struct to fill */

        fputs ("\nenter name & surname: ", stdout);
        if (!fgets (buf, MAXNM, stdin))
            return 1;
        if (*buf == '\n')
            break;

        buf[strcspn (buf, "\n")] = 0;       /* trim trailing '\n' */
        strcpy (tmp.name, buf);

        fputs ("enter age: ", stdout);
        if (!fgets (buf, MAXP, stdin))
            return 1;
        if (sscanf (buf, "%d", &tmp.age) == 1)  /* validate age conversion */
            individuals[n_ind++] = tmp;         /* add tmp to array update n_ind */
    }

    qsort (individuals, n_ind, sizeof *individuals, compasc);   /* sort ascending */
    puts ("\nascending order by age:");

    for (int i = 0; i  < n_ind; i++)
        printf ("  %-24s    %2d\n", individuals[i].name, individuals[i].age);

    qsort (individuals, n_ind, sizeof *individuals, compdesc);  /* sort descending */
    puts ("\ndescending order by age:");

    for (int i = 0; i  < n_ind; i++)
        printf ("  %-24s    %2d\n", individuals[i].name, individuals[i].age);

}

使用/输出示例

按年龄排序,如果年龄相等,则按名称排序:

$ ./bin/individualsbyage

enter name & surname: Jeffrey L Davis
enter age: 80

enter name & surname: Yaseen Nur al Din Khoury
enter age: 80

enter name & surname: Joeri Ong
enter age: 80

enter name & surname:

ascending order by age:
  Jeffrey L Davis             80
  Joeri Ong                   80
  Yaseen Nur al Din Khoury    80

descending order by age:
  Jeffrey L Davis             80
  Joeri Ong                   80
  Yaseen Nur al Din Khoury    80

现在来看一个简单的示例,该示例显示如果年龄不同,则会获得正确的排序:

$ /bin/individualsbyage

enter name & surname: Jeffrey L Davis
enter age: 81

enter name & surname: Yaseen Nur al Din Khoury
enter age: 80

enter name & surname: Joeri Ong
enter age: 79

enter name & surname:

ascending order by age:
  Joeri Ong                   79
  Yaseen Nur al Din Khoury    80
  Jeffrey L Davis             81

descending order by age:
  Jeffrey L Davis             81
  Yaseen Nur al Din Khoury    80
  Joeri Ong                   79

qsort除了针对快速排序进行了优化之外,它的另一个好处是,即使不是'1,000,000'人,它也已被100,000个人使用和测试,并且已经过验证。(不是这样,您只是碰巧整夜凑在一起)

如果您还有其他疑问,请查看。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C中按字母顺序对字符串和结构进行排序

来自分类Dev

在C中按字母顺序对字符串和结构进行排序

来自分类Dev

C:如何对结构中的值进行排序和子排序

来自分类Dev

C:如何对结构中的值进行排序和子排序

来自分类Dev

如何使用C中的整数对带有字符串的结构进行排序?

来自分类Dev

在C中对字符串/结构数组进行排序

来自分类Dev

如何在C ++中按字母顺序对标准输入字符串进行排序?

来自分类Dev

如何按字母顺序对字符串数组进行排序并防止c中的突变

来自分类Dev

如何在C中按降序对结构数组排序

来自分类Dev

在C ++中按字典顺序对字符串进行排序

来自分类Dev

如何在C中对结构数组进行排序?

来自分类Dev

按字符串对结构数组进行排序

来自分类Dev

如何按字符对 List<string> 进行排序?

来自分类Dev

如何按名称对我的图像进行排序?

来自分类Dev

如何在数据结构中按年龄对学生进行排序

来自分类Dev

在结构中按频率对数组中的字母进行排序

来自分类Dev

如何在C ++中从对数字进行排序到按字母顺序进行排序

来自分类Dev

如何在C ++中按特定列的值对2D字符串数组进行排序?

来自分类Dev

如何在函数中对结构进行排序

来自分类Dev

排序功能无法在Swift中对我的结构进行排序

来自分类Dev

在C ++中对结构数组进行排序

来自分类Dev

在C ++中对用户定义的结构进行排序

来自分类Dev

在C中对结构元素进行排序

来自分类Dev

在C中对结构数组进行排序

来自分类Dev

在go lang中按不同维度对点(结构)进行排序

来自分类Dev

按字母顺序对结构中的数据进行排序

来自分类Dev

按字母顺序对结构中的数据进行排序

来自分类Dev

如何使用Java中的map集合按字符串中出现的次数对字符进行排序?

来自分类Dev

在C中,按字符串长度对字符串数组进行排序

Related 相关文章

  1. 1

    在C中按字母顺序对字符串和结构进行排序

  2. 2

    在C中按字母顺序对字符串和结构进行排序

  3. 3

    C:如何对结构中的值进行排序和子排序

  4. 4

    C:如何对结构中的值进行排序和子排序

  5. 5

    如何使用C中的整数对带有字符串的结构进行排序?

  6. 6

    在C中对字符串/结构数组进行排序

  7. 7

    如何在C ++中按字母顺序对标准输入字符串进行排序?

  8. 8

    如何按字母顺序对字符串数组进行排序并防止c中的突变

  9. 9

    如何在C中按降序对结构数组排序

  10. 10

    在C ++中按字典顺序对字符串进行排序

  11. 11

    如何在C中对结构数组进行排序?

  12. 12

    按字符串对结构数组进行排序

  13. 13

    如何按字符对 List<string> 进行排序?

  14. 14

    如何按名称对我的图像进行排序?

  15. 15

    如何在数据结构中按年龄对学生进行排序

  16. 16

    在结构中按频率对数组中的字母进行排序

  17. 17

    如何在C ++中从对数字进行排序到按字母顺序进行排序

  18. 18

    如何在C ++中按特定列的值对2D字符串数组进行排序?

  19. 19

    如何在函数中对结构进行排序

  20. 20

    排序功能无法在Swift中对我的结构进行排序

  21. 21

    在C ++中对结构数组进行排序

  22. 22

    在C ++中对用户定义的结构进行排序

  23. 23

    在C中对结构元素进行排序

  24. 24

    在C中对结构数组进行排序

  25. 25

    在go lang中按不同维度对点(结构)进行排序

  26. 26

    按字母顺序对结构中的数据进行排序

  27. 27

    按字母顺序对结构中的数据进行排序

  28. 28

    如何使用Java中的map集合按字符串中出现的次数对字符进行排序?

  29. 29

    在C中,按字符串长度对字符串数组进行排序

热门标签

归档