【问题标题】:Sorting linked list contents in c alphabetically for movie titles为电影标题按字母顺序对c中的链表内容进行排序
【发布时间】:2019-07-21 11:58:19
【问题描述】:

我试图在 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

【问题讨论】:

  • 请解释为什么您通过复制节点的内容来对链表进行排序。链表的重点不是这样做,而是进行指针操作。在这种特殊的字符串情况下,您会面临许多与不同长度相关的风险;诚然不是你的三个同样长的“a”、“b”、“c”的例子 - 但问题迟早会找到你......
  • 您正在比较 *temp*temp->next 您应该比较 *p*temp 而且,您可以将 while 循环重写为 for()loops,节省 3 行,并且避免很多可能的错误。

标签: c list sorting


【解决方案1】:

除了使用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;
}

这样您就不必复制字符串,这可能比简单地移动节点要花费更长的时间。了解如何移动这些链接的一个好方法是拿起一支铅笔和一张纸并模拟正在排序的列表。这需要时间,但您最终会从中学到很多东西!

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

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 2019-05-14
    • 2014-06-04
    • 2016-10-12
    • 2013-05-02
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多