繁体   English   中英

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

[英]Doesn't qsort() C library function work on linked lists?

我正在尝试对已创建的单链表及其所有项目、指针进行排序。 我正在尝试使用 qsort() C 库 function ,如下所示。 它似乎没有对列表进行排序。 它给了我编译器错误说: 'item' 的左边在代码下面显示的行中指定了未定义的结构/联合'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 个地方调用 function mylistsort() 的方式:

mylistsort(list, sort_fn_descend);//其中list是正确初始化的链表指针。

mylistsort(list, sort_fn_ascend);//其中list是一个正确初始化的链表指针。

1] 如果头节点指针作为基数组(第一个参数)传递给 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;

}

qsort适用于相同大小数据的普通 arrays,而不是链表。

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

  1. 使用链表的所有值创建一个普通数组,对其进行排序,然后转换回链表。
  2. 为您的链表数据结构实现快速排序算法

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM