【问题标题】:How do i sort structure array with pointers?如何使用指针对结构数组进行排序?
【发布时间】:2018-12-18 05:43:30
【问题描述】:

编写一个程序,将id、name和address输入结构数组,并使用指针按名称升序排序?

我尝试在这个论坛中搜索很多问题,但没有一个能完全帮助我。所以这是我的代码:

 #include<stdio.h>
struct student
{
    char name[20], add[30];
    int id;
};
int main()
{
    struct student s[100];
    struct student *sptr;
    int i, j, temp, n;
    char tempc[30];
    sptr=&s;
    printf("How many students do we have to register?");
    scanf("%d",&n);
    printf("Enter the id, name and address of the students and hit enter.");

    for (i=0; i<n; i++)
    {
        scanf("%d%s%s",&sptr->id,&sptr->name,&sptr->add);
        sptr++;
    }
    sptr=&s;
    for(i=0; i<n; i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(strcmp(s[i].name,s[j].name)>0)
            {
                strcpy(tempc,(sptr+i)->name);
                strcpy(sptr->name,(sptr+j)->name);
                strcpy((sptr+j)->name,tempc);
                strcpy(tempc,sptr->add);
                strcpy(sptr->add,(sptr+j)->add);
                strcpy((sptr+j)->add,tempc);
                temp=(sptr+j)->id;
                sptr->id=(sptr+j)->id;
                (sptr+j)->id=temp;

            }
        }
    }
    printf("The sorted form is:");

     for (i=0; i<n; i++)
    {
        printf("%d%s%s",sptr->id,sptr->name,sptr->add);
        sptr++;
    }



}

如果你知道我要去的地方,请帮帮我。是的,我不想使用任何内存分配函数或 sizeof() 函数。

【问题讨论】:

  • 仅供参考,C 支持结构分配。您的结构是完全封闭的(没有指向其他数据的指针)。因此,所有这些成员副本都是毫无意义的。 ,您可以只声明一个临时 struct student 并在您的数组上进行常规元素交换。您还需要打开编译器警告,因为它应该告诉您有很多地方需要 char *,但提供的是 char (*)[20](它们不是同义类型)。 sptr = &amp;s; 也是如此,sptr = s; 应该在那里。
  • 顺便说一句 sizeof 不是一个函数,而是一个运算符,可能它只是一个用括号括起来的常量,仅在应用于类型时才需要,使它有点然而,有点令人困惑。这是完全合法的:size_t myobject_size = sizeof arrayelem[0];

标签: c arrays sorting structure


【解决方案1】:

只需使用qsort,如下所示:

int compare_student (const void * a, const void * b)
{

  struct student *lhs = (struct student *)a;
  struct student *rhs = (struct student *)b;

  return strcmp( lhs->name, rhs->name) ;
}

// N = total number of students;

qsort (s, N, sizeof(struct student), compare_student);

【讨论】:

  • 嘿!我将我的代码简化为:pastebin.com/m0dF3WRu 它仍然没有对它们进行排序,你能纠正我吗?
猜你喜欢
  • 2021-08-02
  • 2014-07-04
  • 1970-01-01
  • 2012-02-25
  • 2020-03-15
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多