c - 我如何对c中的结构数组进行排序

标签 c sorting data-structures

我需要对一组结构进行排序,每个结构都有一个作为名称的字符串。 我想使用冒泡排序和 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);
      }
  }

}

最佳答案

OP 编码错误

    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);如果 (ptr == NULL) Handle_OutOfMemory(); ...//使用 ptr ... free(ptr);

关于c - 我如何对c中的结构数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49922600/

相关文章:

c++ - 为什么为位字段分配值不返回相同的值?

algorithm - 最多n个点的整数数组的排序算法

PHP 基于子对象值的短数组

c - 关于C中链表的下一个字段中最低有效位的声明

algorithm - 为什么最小堆比最大堆更适合实现优先级队列?

C 编程命令行参数

c - 删除冗余参数会导致段错误,似乎无缘无故

c - 返回一个值作为输出参数

Java:TreeSet 和 LinkedList 的问题

c - 基于队列数组的实现