C - 使用双指针插入已排序的链表

时间:2016-11-05 21:16:55

标签: c linked-list

我尝试使用以下代码在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;
}

这是printList:

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

1 个答案:

答案 0 :(得分:2)

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

  • 您使用||代替&&。如果next成员为NULL,则您位于列表的末尾,请插入其中。

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

  • 您不需要在C中投放malloc()的返回值,这会被视为适得其反,特别是如果您忘记包含<stdlib.h>

  • 您不测试分配失败

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

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

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

以下是更正后的版本:

#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;
}