gol*_*ean 0 c linked-list qsort
我正在尝试对已创建的单链表进行排序,并将其所有项目,指针初始化.我正在尝试使用qsort()C库函数,如下所示.它似乎没有排序列表.它给了我编译器错误说: 'item'的左边指定代码中下面显示的未定义的struct/union'LINKED_LIST_S'.
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;
}
Run Code Online (Sandbox Code Playgroud)
这就是在2个地方调用mylistsort()函数的方法:
mylistsort(list,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;
}
Run Code Online (Sandbox Code Playgroud)
qsort 适用于同等大小数据的普通数组,而不是链接列表.