我的任务是改进程序的运行时,该程序将.txt文件中的所有单词排序到哈希表中。这种三嵌套for循环排序算法是问题所在:
// Sort hash table elements and save as pointers in 'array'
for (i = 0; i < tsize; i++)
for (ele = htable[i]; ele != NULL; ele = ele->next) {
if (ele->freq == 1)
scnt++;
for (j = cnt; j > 0 && ele->freq > array[j-1]->freq; j--)
array[j] = array[j-1];
array[j] = ele;
cnt++;
}
我想要做的是使用qsort(),但我迷失了应该从哪里开始。任何建议都会有所帮助,谢谢。
更新: 我已将上述代码段修改如下:
// Sort hash table elements and save as pointers in 'array'
for (i = 0; i < tsize; i++)
for (ele = htable[i]; ele != NULL; ele = ele->next) {
if (ele->freq == 1)
scnt++;
array[cnt] = ele;
qsort(array, tsize, sizeof(h_ptr), (int (*) (const void *, const void *))compare_ele);
cnt++;
}
并添加了这个比较功能:
// Compare function for qsort
int compare_ele (h_ptr *a, h_ptr *b)
{
if (a->freq < b->freq)
return + 1;
if (a->freq > b->freq)
return - 1;
return 0;
}
h_ptr的结构是:
typedef struct HELE {
char *word;
int freq;
struct HELE *next;
} h_rec, *h_ptr;
编译时,我收到此错误:
analysis.c: In function ‘compare_ele’:
analysis.c:137:10: error: request for member ‘freq’ in something not a structure or union
if (a->freq < b->freq)
^
analysis.c:137:20: error: request for member ‘freq’ in something not a structure or union
if (a->freq < b->freq)
^
analysis.c:139:10: error: request for member ‘freq’ in something not a structure or union
if (a->freq > b->freq)
^
analysis.c:139:20: error: request for member ‘freq’ in something not a structure or union
if (a->freq > b->freq)
答案 0 :(得分:1)
更新后的代码中的两个for
循环正在创建一个未排序的数组,同时跟踪变量cnt
中数组中的项目数。在完成qsort
次循环后,您应该致电for
,并将cnt
作为第二个参数传递给qsort
。
比较函数应始终遵循qsort
指定的函数原型。定义一个比较器函数是不好的做法,该函数在用作qsort
的第四个参数时需要强制转换。有关如何编写正确的比较器功能的示例,请参见wikipedia article。
在您的情况下,比较器功能的前两行应为
h_rec *a = *(const h_rec **)p;
h_rec *b = *(const h_rec **)q;
请注意,我总是避免将*
放在typedef中。这是您的错误消息的来源,您没有正确地说明在您的代码中,a
和b
实际上是指向指向结构的指针类型HELE