【发布时间】:2012-04-12 18:40:25
【问题描述】:
我有以下数据结构:
struct scoreentry_node {
struct scoreentry_node *next;
int score;
char name[1];
};
typedef struct scoreentry_node *score_entry;
我正在尝试创建一个函数,该函数按顺序使用我的结构,并根据名称按升序排列它们。我想修改输入而不分配任何内存或释放任何东西:
我已经尝试了您的建议:
void selectionsort(score_entry *a) {
for (; *a != NULL; *a = (*a)->next) {
score_entry *minafteri = a;
// find position of minimal element
for (score_entry j = (*a)->next; j != NULL; j = j->next) {
if (strcmp(j->name, (*minafteri)->name) == -1) {
*minafteri = j;
}
}
// swap minimal element to front
score_entry tmp = *a;
a = minafteri;
*minafteri = tmp;
}
}
我正在使用以下代码测试上述代码:
score_entry x = add(8, "bob", (add( 8 , "jill", (add (2, "alfred", NULL)))));
iprint("",x);
selectionsort(&x);
iprint("", x);
clear(x); //Frees the whole list
iprint() 打印结构中的分数和名称字段。我的添加函数如下:
score_entry add(int in, char *n, score_entry en) {
score_entry r = malloc(sizeof(struct scoreentry_node) + strlen(n));
r->score = in;
strcpy(r->name, n);
r->next = en;
return r;
}
我遇到堆错误,我的第二次打印没有打印排序列表,它什么也没打印。我做错了什么,我能做些什么来解决它?
【问题讨论】:
-
选择排序对于单链表(或一般的列表)来说是一种糟糕的排序算法。如果您正在寻找一种在运行时最优且不分配任何内存的排序算法,请尝试归并排序。
-
char name[1];有点小。对于要以 null 结尾的字符串,唯一有效的字符串是 "",这会使比较名称变得毫无用处。 -
@Philip 进行合并排序我不需要两个列表吗?我只有一个..
-
现在我看到你使用了“struct hack”。
-
可能是,可能不是(行为仍未定义)。你可能在某个地方犯了一个小错误。我不会调查它(因为我认为链表上的选择排序是错误的,而且我不喜欢将指针隐藏在 typedef 后面)
标签: c sorting linked-list structure