所以我想在链表的两个节点之间添加一个新节点,其数据字段基本上包含前一节点和下一节点的总和。我无法理解为什么一旦我进入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;
}
}
答案 0 :(得分:1)
当您开始迭代时,您正在使用:
it = it->next;
prev = it;
it
和prev
指向同一节点。不久之后,你正在使用:
prev->next = new;
与:
相同it->next = new;
这意味着it->next
指向新节点。这意味着,你永远不会真正超越新创建的节点。
您可以使用以下方法解决此问题:
prev = it;
it = it->next;
在while
循环开始之前。
通过使用:
,我会更加强大prev = it;
if ( it != NULL )
{
it = it->next;
}
目前,it
可能为NULL。将while
语句中的条件更改为:
while (it != NULL) {
答案 1 :(得分:0)
我可以先建议用较小的部分破解你的代码
有一个插入新对象的功能
对于单链表,应在以下后插入:
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
总是如此,您可以避免为空列表添加特殊情况
存在,并且不包含任何数据。 (它是一个虚拟节点)