2011-08-17 92 views
0

我正在嘗試對已創建的單鏈表和其所有項目,指針進行初始化。我正在嘗試使用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; 

} 
+0

感謝大家在評論中給予指點,回覆。修正了函數sort_fn_descen/ascent中的錯誤,並且代碼正在對lsit進行排序。 FYI--上面的下降函數應該返回b-a並且提升fn應該返回一個-b – goldenmean

回答

-1

由於我能解決問題,使用@muskie在他的回答中提出的方法2],我在這裏發佈答案。 需要在已編輯的OP中提到的功能sort_fn_descend/ascend中的錯誤修復,並且代碼正在對列表jsut進行排序。錯誤修復FYI - 上面的下降函數應該返回b - a並且提升fn應該返回a - b。

6

qsort作品在同樣大小的數據,而不是鏈表的普通陣列。

+0

你知道如果我將鏈表指針傳遞給qsort而不是數組基指針會是什麼樣的行爲?什麼是編譯錯誤修復? – goldenmean

+1

您可能會得到非常奇怪的結果(其中指針也被視爲數據,也被排序,或無關數據被排序),也可能是訪問衝突錯誤,或其他。 IOW,行爲是不確定的。如果沒有訪問違規,它可能會打亂你的記憶。 –

2

要排序的鏈表,你可以考慮以下選項:

  1. 與鏈表的所有值,這個排序創建一個普通數組,並轉換回一個鏈表。
  2. 爲您的鏈接列表數據結構實施the quicksort algorithm
+3

您可能並不想爲鏈接列表實現快速排序 - 如果您打算這麼做,請改爲實施mergesort。 –

+0

@ muksie - 謝謝。但是什麼是編譯錯誤修復? – goldenmean

+0

要點2:對於單向鏈表,不會很容易,當然也不是非常有效。