结构阵列的排序成员(sorting members of structure array)

2019-07-03 19:58发布

给定一个结构阵列(C)中,我试图在性别的群体和通过数字顺序子以便打印出结果。 例如:

struct employee{
char gender[13]
char name[13];
int id;
};

说我定义结构阵列像这样:

struct employee info[2]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};

我怎么能去打印效果一样

1234 Matt
1235 Josh


2345 Jessica

Answer 1:

你将需要实现的结构,你需要一个比较的排序功能

int compare(const void *s1, const void *s2)
{
  struct employee *e1 = (struct employee *)s1;
  struct employee *e2 = (struct employee *)s2;
  int gendercompare = strcmp(e1->gender, e2->gender);
  if (gendercompare == 0)  /* same gender so sort by id */
    return e1->id - e2->id;
  else
    return -gendercompare;  /* the minus puts "male" first as in the question */
}

然后使用快速排序标准库中。

qsort(data, count, sizeof(struct employee), compare);

里面的比较功能你可能要检查的ID都是平等的,那么你可以通过名称(也使用排序strcmp()但是你喜欢。

编辑:刚才编译和固定这件事。 这里有一个小测试程序

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

    struct employee{
      char gender[13];
      char name[13];
      int id;
    };

    int compare(const void *s1, const void *s2)
    {
      struct employee *e1 = (struct employee *)s1;
      struct employee *e2 = (struct employee *)s2;
      int gendercompare = strcmp(e1->gender, e2->gender);
      if (gendercompare == 0)  /* same gender so sort by id */
        return e1->id - e2->id;
      else
        return -gendercompare;
    }

    main()
    {
      int i;
      struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};

      for (i = 0; i < 3; ++i)
        printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);

      qsort(info, 3, sizeof(struct employee), compare);

      for (i = 0; i < 3; ++i)
        printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
    }

随着输出:

$ ./a.exe
1234    male    Matt
2345    female  Jessica
1235    male    Josh
1234    male    Matt
1235    male    Josh
2345    female  Jessica


Answer 2:

该结构阵列上使用您喜欢的排序算法。 当比较阵列来决定哪个是“大”,比较它们的性别的两个元件; 如果男女都一样,比较它们的数量。 (您可能需要定义一个单独的函数来做这个比较,让事情更加清楚。)然后,使用所需的格式打印数组排序秩序。 跟踪时,性别从男性对女性的切换,所以你可以把一个额外的3个换行,因为在你的榜样。

编辑:从kallikak耍赖借,你可以通过你的比较函数来快速排序,但有它返回1,如果一个结构是“大”,-1,如果它是“少”和(如有必要)0,如果是一样的(使用程序I如上文所述)。 看看如何写从STDLIB的qsort比较功能? 有关编写自定义的比较功能的帮助。



Answer 3:

认为这是比较容易理解,因为我在指针很微弱,希望它有助于............

#include<bits/stdc++.h>

using namespace std;


struct employee{
  char gender[13];
  char name[13];
  int id;
};

bool compare(employee s1,employee s2)
{
  return s1.id<s2.id;
}

main()
{
  int i;
  struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};
  sort(info,info+3,compare);
  for (i = 0; i < 3; i++)
  printf("%d\t%s\t%s\n",info[i].id,info[i].gender,info[i].name);
}


文章来源: sorting members of structure array