2015-02-23 141 views
0

所以我想在链表的两个节点之间添加一个新节点,其数据字段基本上包含前一节点和下一节点的总和。我无法理解为什么一旦我进入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; 
} 

}

回答

1

当你开始迭代,你正在使用:

it = it->next; 
prev = it; 

itprev都指向同一个节点。过了一会儿,你使用:

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) { 
+0

我做了你的建议,并且循环错误得到解决,但它仍然崩溃。如果在我的列表中有5个节点,它会循环4次(应该没问题),但是在最后一次循环之后,一切都会冻结。 – SCoder 2015-02-23 18:56:11

+0

你知道它崩溃在哪条线吗? – 2015-02-23 18:58:24

+0

它在退出while循环后立即崩溃。 – SCoder 2015-02-24 08:35:49

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总是
存在,并且不包含任何数据。 (它是一个虚拟节点)