Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
qsort()C库函数对链表不起作用吗?_C_Linked List_Qsort - Fatal编程技术网

qsort()C库函数对链表不起作用吗?

qsort()C库函数对链表不起作用吗?,c,linked-list,qsort,C,Linked List,Qsort,我试图对已创建的单链表及其所有项、指针进行排序。我正在尝试使用qsort C库函数,如下所示。它似乎没有对列表进行排序。这给了我一个错误,说: “item”左侧指定代码中下面显示的行中未定义的结构/联合“LINKED_LIST” struct LINKED_LIST_S { int item; struct LINKED_LIST_S * next; } ; typedef int (*cmpfn)(const void *ptr1, const voi

我试图对已创建的单链表及其所有项、指针进行排序。我正在尝试使用qsort C库函数,如下所示。它似乎没有对列表进行排序。这给了我一个错误,说: “item”左侧指定代码中下面显示的行中未定义的结构/联合“LINKED_LIST”

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的方式:

我的列表,排序和下降//其中列表是正确初始化的链表指针

我的列表、排序和升序//其中列表是正确初始化的链表指针

1] 如果头节点poitner作为基本数组第一个参数传递给qsort,则qsort在链表上不起作用

2] 如何在上述代码中使用qsort实现此链表的排序

编辑:谢谢你的回答。现在,我实现了一种对列表进行排序的方法,正如@muksie approach 1]所述,他建议的,如下代码所示。qsort仍然不返回已排序的整数数组。 首先,我想对一个包含100个元素的数组进行降序排序,但传递的数组正好相反,即元素的升序为1,2,…100。我做错了什么?我怎样才能修好它


qSead适用于相同大小的数据的数组,而不是链表。

q排序适用于相同大小的数据的平直数组,而不是链表。

< P>排序您的链表可以考虑以下选项:

使用链表的所有值创建一个普通数组,对其进行排序,然后转换回链表。 为您的链表数据结构实现。
>排序你的链接列表,你可以考虑以下选项:

使用链表的所有值创建一个普通数组,对其进行排序,然后转换回链表。 为您的链表数据结构实现。
由于我能够使用@muskie在回答中建议的方法2]解决这个问题,所以我将答案发布在这里。
需要修复编辑的OP中提到的函数sort_fn_down/ascend中的错误,代码正在对列表jsut进行精细排序。错误修复供参考-上面的下降功能应返回b-a,上升功能应返回a-b

由于我能够使用@muskie在回答中建议的方法2]解决这个问题,所以我将答案发布在这里。
需要修复编辑的OP中提到的函数sort_fn_down/ascend中的错误,代码正在对列表jsut进行精细排序。错误修复供参考-上面的下降功能应返回b-a,上升功能应返回a-b

您知道如果我将linkedlist指针传递给qsort而不是数组基指针,会发生什么行为吗?那么什么是编译错误修复程序呢?如果指针也被视为数据并被排序,或者不相关的数据被排序,或者可能是访问冲突错误,或者诸如此类,那么就会得到非常奇怪的结果。瞧,这种行为还没有定义。如果没有访问冲突,它可能会破坏您的内存。您知道如果我将linkedlist指针传递给qsort而不是数组基指针,会发生什么行为吗?那么什么是编译错误修复程序呢?如果指针也被视为数据并被排序,或者不相关的数据被排序,或者可能是访问冲突错误,或者诸如此类,那么就会得到非常奇怪的结果。瞧,这种行为还没有定义。如果没有访问冲突,它可能会破坏您的内存。您可能并不真的想对链接列表实施快速排序-如果要这样做,请改为实施合并排序。第2点:对于单个链接列表来说,这并不容易,当然也不是很有效@goldenmean:没有。@Steve Jessop:很抱歉弄清楚了,你是说没有修复程序来删除我提到的编译器错误,还是你的意思是什么?@goldenmean:没有修复编译错误。qsort不知道如何跟随链接列表中的下一个指针。因此,没有一个小的调整,将使你想发生的事情,发生。您可以用struct LINKED_LIST_S*替换LINKED_LIST_S*以关闭该特定错误,但代码仍将具有未定义的行为。您可能并不真的希望为链接列表实现快速排序-如果您要这样做,实现一个mergesort。第2点:对于一个单链表来说,这并不容易,当然也不是很有效@goldenmean:没有。@Steve Jessop:很抱歉弄清楚了,你是说没有修复程序来删除我提到的编译器错误,还是你的意思是什么?@goldenmean:没有修复编译错误。qsort不知道如何跟随链接列表中的下一个指针。因此,没有一个小的调整,将使你想发生的事情,发生。您可以用struct LINKED_LIST_S*替换LINKED_LIST_S*以关闭该特定错误,但代码仍将具有未定义的行为。感谢大家在您的评论、回复中提供指针。函数中的错误修复
s sort_fn_descen/ascend,代码对lsit进行精细排序。仅供参考-上面的下降函数应返回b-a,上升函数应返回a-b感谢所有人在您的评论、回复中提供指针。函数sort\u fn\u descen/ascent中的错误修复,代码正在对lsit进行精细排序。仅供参考-上面的下降功能应返回b-a,上升功能应返回a-b
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;

}