Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
C 按电影标题的字母顺序对链接列表内容进行排序_C_List_Sorting - Fatal编程技术网

C 按电影标题的字母顺序对链接列表内容进行排序

C 按电影标题的字母顺序对链接列表内容进行排序,c,list,sorting,C,List,Sorting,我试图用c语言按字母顺序对电影标题的链接列表进行排序,但我搞不懂。这就是我到目前为止所做的: ReviewNode *sortReviewsByTitle(ReviewNode *head) { char tempTitle[MAX_STR_LEN]; ReviewNode *p = NULL; ReviewNode *temp = NULL; p = head; while (p!= NULL){ temp = p; wh

我试图用c语言按字母顺序对电影标题的链接列表进行排序,但我搞不懂。这就是我到目前为止所做的:

ReviewNode *sortReviewsByTitle(ReviewNode *head)
{
    char tempTitle[MAX_STR_LEN];
    ReviewNode *p = NULL;
    ReviewNode *temp = NULL;
    p = head;
    while (p!= NULL){
        temp = p;
        while(temp->next != NULL){
            if(strcmp(temp->review.movie_title, temp->next->review.movie_title) > 0){
                strcpy(tempTitle, temp->review.movie_title);
                strcpy(temp->review.movie_title, temp->next->review.movie_title);
                strcpy(temp->next->review.movie_title, tempTitle);
            }
            temp = temp->next;
        }
        p = p ->next;
    }
    return head;
我的一个测试用例:排序:c,b,a并返回b,a,c,而不是使用strcpy,为什么不简单地移动节点的指针呢?如果是单链接列表,则需要一个before节点,它是temp节点的前一个节点,因此在执行temp=temp->next时,首先执行before=temp。这是处理双链接节点的方法:

if (strcmp(/*...*/) > 0) {
    ReviewNode *swap = temp->next;
    temp->next = swap->next;
    swap->prev = temp->prev;
    swap->next = temp;
    temp->prev = swap;
}
通过这种方式,您不必复制字符串,这可能比简单地移动节点要花费更长的时间。了解如何移动这些链接的一个好方法是抓起一支铅笔和一张纸,模拟正在排序的列表。这需要时间,但最终你会从中学到很多


如果没有更多的信息,就很难知道你面临着什么问题。祝你好运

您介意发布一个链接吗?请解释为什么您要通过复制周围节点的内容来对链接列表进行排序。链表的要点不是这样做,而是做指针操作。在字符串的这种特殊情况下,您将面临与不同长度相关的许多风险;诚然,对于三个同样长的a、b、c的例子来说,情况并非如此,但问题迟早会出现……您正在比较*temp和*temp->下一步您应该比较*p和*temp,您可以将while循环重写为forloops,节省3行代码,并避免许多可能的错误。