我有以下數據結構:選擇排序與鏈表的
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