我有以下数据结构:选择排序与链表的
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;
}
我得到堆错误,我的第二个打印不打印排序列表,它不打印任何东西。我做错了什么,我能做些什么来解决它?
选择排序是单链表一个坏的排序算法(或列表一般,对于这个问题)。如果您正在寻找一种在运行时都是最优的排序算法,并且不分配任何内存,请尝试mergesort。 – Philip 2012-03-29 06:15:18
'char name [1];'有点小。对于以空字符结尾的字符串,唯一有效的字符串将是“”,这将比较名称而非无用的。 – wildplasser 2012-03-29 10:42:59
@Philip合并排序不会需要两个列表?我只有一个.. – Thatdude1 2012-03-29 15:21:43