我正在嘗試對已創建的單鏈表和其所有項目,指針進行初始化。我正在嘗試使用qsort()C庫函數,如下所示。它似乎沒有排序清單。這是給我編譯器錯誤說: 左'項目'指定未定義的結構/聯合'LINKED_LIST_S'在代碼下面顯示的行。不qsort()C庫函數在鏈接列表上工作?
struct LINKED_LIST_S
{
int item;
struct LINKED_LIST_S * next;
} ;
typedef int (*cmpfn)(const void *ptr1, const void *ptr2);
int mylistsort(my_list_t list, cmpfn f1)
{
qsort (list , 100, sizeof (struct LINKED_LIST_S), (fn));
return -1;
}
int sort_fn_ascend(const void *ptr1, const void *ptr2)
{
int a = (*(LINKED_LIST_S *)ptr1).item; //Compiler error
int b = (*(LINKED_LIST_S *)ptr2).item; //Compiler error
return b - a;
}
int sort_fn_descend(const void *ptr1, const void *ptr2)
{
int a = ((struct LINKED_LIST_S *)ptr1)->item; //Compiler error
int b = ((struct LINKED_LIST_S *)ptr2)->item; //Compiler error
return a - b;
}
這是功能mylistsort()怎麼叫,在2個地方:
mylistsort(列表,sort_fn_descend); //其中列表中的正確初始化鏈表指針。
mylistsort(list,sort_fn_ascend); //列出一個正確初始化的鏈表指針。
1]如果頭節點poitner作爲基數組(第一個參數)傳遞給qsort,qsort()不會在鏈表上工作。
2]如何在上面的代碼中使用qsort()對這個鏈表進行排序?
編輯:謝謝你的答案。現在我已經實施了一種方法來對列表進行排序,正如他所建議的@muksie方法1所述,如下面的代碼所示。仍然qsort()不會返回一個有序整數數組。 首先,我想按降序對100個元素的數組進行排序,但是傳遞的數組完全相反,即元素的升序從1,2,... 100開始。我究竟做錯了什麼?我該如何解決它?
int linkedListSort(LINKED_LIST_T list, newCompareFunction fn, void *usr_info)
{
LINKED_LIST_T tmpptr = list;
int newitems[N_ITEMS];
int i=0;
//Logic to get all the items in the list in a array
while(tmpptr != NULL)
{
newitems[i] = tmpptr->item;
tmpptr = tmpptr->next;
i++;
}
tmpptr = list;
i = 0;
//Sort that array
//qsort (list , 100, sizeof (struct LINKED_LIST_S), (fn));
qsort (newitems , 100, sizeof(list->item), (fn));
//store the sorted items back into the list.
while(tmpptr != NULL)
{
tmpptr->item = newitems[i];
tmpptr = tmpptr->next;
i++;
}
return -1;
}
int sort_fn_descend(void *ptr1,void *ptr2)
{
int a = *((int*)(ptr1));
int b = *((int*) (ptr2));
return a - b;
}
int sort_fn_ascend(const void *ptr1, const void *ptr2)
{
int a = *((int*)(ptr1));
int b = *((int*) (ptr2));
return b - a;
}
感謝大家在評論中給予指點,回覆。修正了函數sort_fn_descen/ascent中的錯誤,並且代碼正在對lsit進行排序。 FYI--上面的下降函數應該返回b-a並且提升fn應該返回一個-b – goldenmean