【问题标题】:C - Inserting into sorted linked list with double pointersC - 使用双指针插入排序链表
【发布时间】:2016-11-05 21:16:54
【问题描述】:

我正在尝试使用以下代码在 C 中创建一个排序的链表,但在打印任何输入之前我遇到了分段错误。我相信这是因为我在我的 while 循环中检查了((*link)->value < val),但一开始它是NULL。如果列表中没有元素,我还尝试添加条件,但这不起作用。在没有 seg 的情况下,我如何检查要添加的值是否更小。有错吗?

struct NodeTag {
    int value;
    struct NodeTag *next;
};
typedef struct NodeTag Node;

typedef struct {
    Node *head;
    int length;
} List;

void insertSorted(List *list, int val) {
    Node **link = &(list->head);

    while (*link != NULL || (*link)->value < val) {
        //move node to correct place in list
        link = &((*link)->next);
    }
    //create new node
    Node *n = (Node *)malloc(sizeof(Node));
    n->value = val;

    //set next to null
    n->next = NULL;

    //insert new node
    *link = n;
}

这里是打印列表:

void printList(List *list) {
    printf("%d elements :", list->length);

    for (Node *n = list->head; n; n = n->next)
        printf( " %d", n->value);
    printf( "\n" );
}

输入:72 19 47 31 8 36 12 88 15 75 51 29

预期输出:8 12 15 19 29 31 36 47 51 72 75 88

【问题讨论】:

  • 您需要更改 ||到&&
  • 这只会输出 12 个值中最小的 4 个。输入为:72 19 47 31 8 36 12 88 15 75 51 29,列表打印为:8 12 15 29

标签: c linked-list


【解决方案1】:

以下是您的代码中的一些问题:

  • 您使用|| 而不是&amp;&amp;。如果next 成员是NULL,则您在列表的末尾,请直接插入。

  • 参数名称是list,但您在正文中使用link

  • 您不需要在 C 中强制转换 malloc() 的返回值,这被认为会适得其反,尤其是如果您忘记包含 &lt;stdlib.h&gt;

  • 您没有测试分配失败

  • 您没有将列表的其余部分链接到插入的节点。

  • 函数应该返回一个指向插入节点的指针,让调用者有机会检查内存分配失败。

  • 你不应该评论显而易见的事情。

这是一个更正的版本:

#include <stdlib.h>

Node *insertSorted(List *list, int val) {
    Node **link = &list->head;
    while (*link != NULL && (*link)->value < val) {
        //skip this node
        link = &(*link)->next;
    }
    //create new node
    Node *n = malloc(sizeof(Node));
    if (n != NULL) {
        n->value = val;
        n->next = *link; // link the rest of the list
        *link = n;   //insert new node
    }
    return n;
}

【讨论】:

  • 对不起,我忘了包括这一行: Node **link = &( list->head );在代码的开头
  • @AaronHiller: 好的,你也忘了发布ListNode 的定义。
  • 添加了,如何让它不跳过值?
  • @AaronHiller:更正后的代码会跳过值吗?你能发布一个完整的程序,其中包含打印功能和主要功能以及输入值和预期输出吗?
  • 已发布。当前代码(使用 && 而不是 ||)似乎跳过了一些值
猜你喜欢
  • 2019-04-20
  • 2020-07-06
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多