qsort()C库函数不能在链表上工作吗?

时间:2011-08-17 10:59:14

标签: c linked-list qsort

我正在尝试对已创建的单个链接列表及其所有项目进行排序,指针已初始化。我正在尝试使用qsort()C库函数,如下所示。它似乎没有排序列表。它给了我编译错误说:  左侧的'strong'指定未定义的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;

}

这就是在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;

}

3 个答案:

答案 0 :(得分:7)

qsort适用于同等大小数据的普通数组,而不是链接列表。

答案 1 :(得分:2)

要对链接列表进行排序,您可以考虑以下选项:

  1. 使用链接列表的所有值创建一个普通数组,对其进行排序,然后转换回链接列表。
  2. 为您的链表数据结构实施the quicksort algorithm

答案 2 :(得分:-1)

由于我能够解决问题,使用@muskie在他的回答中提出的方法2],我在这里发布答案。 需要在编辑的OP中提到的函数sort_fn_descend / ascend中的错误修复,并且代码正在对列表jsut进行排序。错误修复FYI - 上面的下降函数应该返回b - a并且上升fn应该返回a - b。