在链表中的第n个位置插入一个节点;这段代码有什么问题?

时间:2016-10-16 02:46:08

标签: c linked-list

我有这个功能可以在链表中的特定位置插入新数据,但它不起作用:

Node* InsertNth(Node *head, int data, int position) {
    struct Node *h = head; 
    struct Node *p = (struct Node *)malloc(sizeof(struct Node));

    for (i=0; i<position; i++)   
        { h = h->next; }

    p->next = h;  // what's wrong in this line 
    h = p;        // what's wrong in this line
}

如果我在i=0循环中将i=1更改为for,并使用&#34更改行中的h,那么&#39; s错误&#34;评论  h->next,结果很好,我已经看到了很多这个问题的解决方案。每个人都写i=1h->next - 但为什么不i=0h

1 个答案:

答案 0 :(得分:4)

在链接列表中间插入节点时,需要更新位于 new位置之前的上一个节点的next字段节点。

在链接列表的前面插入节点时,需要更新列表的 head 指针以指向 new 节点,该节点现在指向头部的next字段。

您没有在代码中执行上述任何操作,因此p实际上根本没有添加到列表中。你只是在泄露它的记忆。

您也未验证position是否在列表范围内。如果position太大,您的代码将最终访问NULL指针并崩溃。

话虽如此,尝试更像这样的事情:

Node* InsertNth(Node **head, int data, int position) {
    if ((!head) || (position < 0)) return NULL;

    struct Node *h = *head;
    struct Node *prev = NULL;

    for(int i = 0; i < position; ++i) {
        if (!h) return NULL;   
        prev = h;
        h = h->next;
    }

    struct Node *p = (struct Node *) malloc(sizeof(struct Node));
    if (!p) return NULL;

    p->data = data;

    p->next = h;
    if (prev) prev->next = p;
    if (*head == h) *head = p;

    return p;
}

Node *list = NULL;
// add nodes as needed...
...
Node *n = InsertNth(&list, data, position);
if (n) {
    // success 
} else {
    // error
}