【问题标题】:How to sort something with type of struct如何对结构类型的东西进行排序
【发布时间】:2020-03-15 12:30:59
【问题描述】:

我有一个结构元素类型

typedef struct
{
    int AtomicNumber;
    char Name[31];
    char Symbol[4];
} ElementType;

我正在尝试实现一种按字母顺序对元素进行排序的排序算法。我比较了字符串,但没有任何效果。我无法弄清楚下面的函数有什么问题。

void sortAlphabetical(ElementType elements[NUM_ELEMENTS])
{
   printf("SORTING!\n");
   int c, d;
   for (c = 0 ; c < NUM_ELEMENTS - 1; c++)
   {
       for (d = 0 ; d < NUM_ELEMENTS - c - 1; d++)
       {
           if (elements[d].Name > elements[d+1].Name)
           {
                ElementType temp;

                temp.AtomicNumber = elements[d].AtomicNumber;
                strcpy(temp.Name, elements[d].Name);
                strcpy(temp.Symbol, elements[d].Symbol);

                elements[d].AtomicNumber = elements[d+1].AtomicNumber;
                strcpy(elements[d].Name, elements[d+1].Name);
                strcpy(elements[d].Symbol, elements[d+1].Symbol);

                elements[d+1].AtomicNumber = temp.AtomicNumber;
                strcpy(elements[d+1].Name, temp.Name);
                strcpy(elements[d+1].Symbol, temp.Symbol);
           }
       }
   }
}

【问题讨论】:

  • 您不能直接比较数组或字符串。请改用strcmp(elements[d].Name , elements[d+1].Name)
  • qsort 是一个选项吗?此设计无需手动strcpy,您只需分配结构元素ElementType temp = elements[d]; elements[d] = elements[d + 1]; elements[d + 1] = temp;
  • 仅供参考:名称最长的元素是 Rutherfordium (104, Rf),其长度为 13。您可以将结构中的 31 更改为 16(14 就足够了,但 16 不会) t 改变结构的大小)。该符号可以是占位符元素名称的 3 个字符,例如“Ununquadium”、原子序数 114、符号 Uuq。这是在元素真正被发现并被赋予“正确”名称之前——Flerovium, 114, Fl。 Flerovium(和 Livermorium)于 2012 年命名; Oganesson 和其他 3 人在 2016 年被命名。前 7 个时期的所有元素现在都有专有名称。

标签: c algorithm sorting


【解决方案1】:
if (elements[d].Name > elements[d+1].Name)

C 的&gt; 运算符不够“聪明”,无法按字典顺序比较字符串;它仅适用于数字或指针。这个条件实际上只是将char* 指针与名称的第一个字符进行比较。

相反,您需要 strcmp 函数:

if (strcmp(elements[d].Name, elements[d+1].Name) > 0)

此外,您可以考虑使用qsort,而不是编写自己的冒泡排序,这正是这类事情,更容易编写,并且对于大型数组可能更快:

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

int compareElementNames(const void* p1, const void* p2)
{
    const ElementType *elem1 = p1;
    const ElementType *elem2 = p2;
    return strcmp(elem1->Name, elem2->Name);
}

void sortAlphabetical(ElementType elements[NUM_ELEMENTS])
{
    qsort(elements, NUM_ELEMENTS, sizeof(*elements), compareElementNames);
}

【讨论】:

    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2020-11-23
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多