C结构题
我有一个单词列表及其相应的频率:
word 10
the 50
and 35
overflow 90
我应该如何将这些数据保存在结构中?我应该使用二维数组吗?我还应该注意我必须按它们的频率对它们进行排序,所以我在考虑某种数组然后应用 qsort,但我需要保留整数,所以如果我使用 char 数组,我必须来回转换
可能是一个结构:
struct WordInfo {
char *word;
int frequency;
};
然后,您可以制作这些结构的数组:
struct WordInfo words[128]; // whatever
最后写一个像这样的比较器函数:
int word_compare(const void *p1, const void *p2)
{
struct WordInfo *s1 = p1;
struct WordInfo *s2 = p2;
return s1->frequency - s2->frequency;
}
如果您知道要处理的字符串的最大字符数,则意味着在结构中使用数组和 int 数据类型。
typded struct _data
{
char word[MAX_CHARS];
int freq;
}DATA;
...
DATA *d = malloc(sizeof(DATA) * n);
如果您不知道word
go for pointer charater的最大字符数char *word;
。在这种情况下,每个条目都会发生内存分配,这会影响性能并且会导致更多的碎片。
最好一次分配一块内存,而不是n
多次分配小内存。
您还可以拥有一个 std::pair 数组
然后你可以运行任何你想根据第二个元素对数组进行排序的排序算法。例如,您将拥有:
std::pair myArray[大小];
定义结构类型,例如
struct wordAndFrequency
{
char *word;
int count;
};
然后拿一个数组struct wordAndFrequency
和qsort
那个。
typedef struct Dict {
char *word;
int frequency;
} Dictionary;
现在创建此结构对象的数组并将其用作哈希图。当你遇到一个单词时,看看这个单词是否存在,增加计数器,否则添加这个单词,计数为 1。
Dictionary *dictionary=(Dictionary*)malloc(sizeof(Dictionary)*SIZE);