如何在C语言中对结构体数组进行排序

4

我需要对一个结构体数组进行排序,每个结构体中都有一个字符串作为名称。我想使用冒泡排序和strcmp函数进行简单的排序,但我的代码无法正常工作,它会输出整个循环中最后输入的那个名称。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 16
#define N 5

struct Prova {
  char nome[SIZE];
};

void sort(struct Prova *ptr) {
  char temp[SIZE];

  for (int i = 0; i < N; i++) {
    for (int j = i + 1; j < N; j++) {
      if (strcmp((ptr + i)->nome, (ptr + j)->nome) < 0) {
        strcpy(temp, (ptr + i)->nome);
        strcpy((ptr + i)->nome, (ptr + j)->nome);
        strcpy(temp, (ptr + j)->nome);
      }
    }
  }
}

int main() {
  struct Prova * ptr;
  ptr = (struct Prova*) malloc(N * sizeof(struct Prova));

  for (int i = 0; i < N; i++) {
    scanf(" %s", (ptr + i)->nome);
  }

  sort(ptr);

  for (int i = 0; i < N; i++) {
    printf("%s\n", (ptr + i)->nome);
  }
}

基本上,它需要对结构体中的所有名称进行排序,并按名称的第一个字母升序打印它们。

更新:后来我注意到了代码中的错误,感谢大家的回复/建议。现在是这样的:

  for(int i = 0; i < N - 1; i++)
{
  for(int j = i+1; j < N; j++)
  {
    // < 0 = Z-A  invece > 0 = A-Z
    if(strcmp((ptr+i)->nome,(ptr+j)->nome) > 0)
      {
        strcpy(temp, (ptr+i)->nome);
        strcpy((ptr+i)->nome,(ptr+j)->nome);
        strcpy((ptr+j)->nome, temp);
      }
  }

}

4
要对数组进行排序,可以使用qsort函数。 - Karsten Koop
1
使用 if(strcmp(ptr[j].nome,ptr[j+1].nome) < 0) 并循环到 j < N-1。还要注意用于索引数组的简化符号。 - Paul Ogilvie
@Alpay,那不正确:他分配了一个大数组。 - Paul Ogilvie
2
"但是我的代码不起作用" --> 发布使用的输入、看到的输出和期望的输出。这将改善帖子并导致快速解决方案。 - chux - Reinstate Monica
你可能会喜欢阅读这篇文章:如何调试小程序 - alk
显示剩余3条评论
2个回答

0

操作错误编码

    strcpy(temp, (ptr + i)->nome);
    strcpy((ptr + i)->nome, (ptr + j)->nome);
    // strcpy(temp, (ptr + j)->nome);
    strcpy((ptr + j)->nome, temp);

还有许多其他的改进可能

  1. 使用 qsort() @Karsten Koop
  2. 验证输入。最好使用 fgets()
  3. 简化、检查和释放 --> struct Prova *ptr = malloc(sizeof *ptr * N); if (ptr == NULL) Handle_OutOfMemory(); ... // use ptr ... free(ptr);

0
问题出在最后一个strcpy语句上。你需要将参数反转,像这样:
for (int i = 0; i < N; i++) {
    for (int j = i + 1; j < N; j++) {
      if (strcmp((ptr + i)->nome, (ptr + j)->nome) < 0) {
        strcpy(temp, (ptr + i)->nome);
        strcpy((ptr + i)->nome, (ptr + j)->nome);
        strcpy((ptr + j)->nome, temp);
      }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接