在链表中的两个其他节点之间插入节点

时间:2015-02-23 18:26:19

标签: c linked-list

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

}

2 个答案:

答案 0 :(得分:1)

当您开始迭代时,您正在使用:

it = it->next;
prev = it;

itprev指向同一节点。不久之后,你正在使用:

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总是如此,您可以避免为空列表添加特殊情况 存在,并且不包含任何数据。 (它是一个虚拟节点)