我有这个功能可以在链表中的特定位置插入新数据,但它不起作用:
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=1
和h->next
- 但为什么不i=0
和h
?
答案 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
}