【问题标题】:insert node inbetween two others in a linked list在链表中的其他两个节点之间插入节点
【发布时间】:2015-02-23 18:26:19
【问题描述】:

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

}

【问题讨论】:

    标签: c linked-list


    【解决方案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) {
    

    【讨论】:

    • 我按照你的建议做了,循环错误已经解决,但它仍然崩溃。如果我的列表中有 5 个节点,它会循环 4 次(应该没问题),但在最后一个循环之后,一切都冻结了。
    • 你知道它在哪一行崩溃吗?
    【解决方案2】:

    我可以先建议将您的代码分解成更小的部分
    有一个插入新对象的函数
    对于单链表,这应该插入到:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2014-02-01
      • 2021-08-02
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多