在链表中插入两个节点之间的节点
问题描述:
所以我想在链表的两个节点之间添加一个新节点,其数据字段基本上包含前一节点和下一节点的总和。我无法理解为什么一旦我进入while循环,我无法摆脱它。有什么建议么?谢谢。在链表中插入两个节点之间的节点
这里是我的代码:
void modify_list (node *head) {
nodo *it = head;
nodo *prev = NULL;
int n_prev = 0;
int n_next = 0;
int sum = 0;
it = it->next;
prev = it;
while (it->next != NULL) {
it->data = n_next;
prev->data = n_prev;
sum = n_next + n_prev;
node *new;
new = malloc(sizeof(node));
if (new == NULL) {
printf("Error.\n");
return;
}
memset(nuovo, 0, sizeof(node));
new->data = sum;
prev->next = new;
new->next = it;
sum = 0;
prev = it;
it = it->next;
}
}
答
当你开始迭代,你正在使用:
it = it->next;
prev = it;
it
和prev
都指向同一个节点。过了一会儿,你使用:
prev->next = new;
这是一样的:
it->next = new;
这意味着it->next
指向新节点。这意味着,你永远不会经过新创建的节点。在while
循环开始前
prev = it;
it = it->next;
:
您可以通过使用解决这个问题。
我会做出更强大的使用:
prev = it;
if (it != NULL)
{
it = it->next;
}
这时,it
可能为NULL。更改条件的while
声明:
while (it != NULL) {
答
首先,我建议打破你的代码了较小的部分
有插入一个新的对象
对于一个单向链表的功能,这应该插入后:
void InsertAfter(Node* n, DATA data)
{
Node* newnode = malloc(sizeof(Node));
newnode->data = data;
newnode->next = n->next;
n->next = newnode;
}
然后你有一个功能,找到插入点
这可能是例如
Node* FindLastSmaller(Node* n, DATA data)
{
while(true)
{
if(! n->next) return n;
if(n->next->data > data) return n;
n = n->next;
}
}
然后,他们变得容易结合:
void InsertSorted(Node* n, DATA data)
{
Node* inspos = FindLastSmaller(n,data);
InsertAfter(inspos,data);
}
可避免增加特殊情况下的空单,如果head
总是
存在,并且不包含任何数据。 (它是一个虚拟节点)
我做了你的建议,并且循环错误得到解决,但它仍然崩溃。如果在我的列表中有5个节点,它会循环4次(应该没问题),但是在最后一次循环之后,一切都会冻结。 – SCoder 2015-02-23 18:56:11
你知道它崩溃在哪条线吗? – 2015-02-23 18:58:24
它在退出while循环后立即崩溃。 – SCoder 2015-02-24 08:35:49