C 如何在单个链表中迭代和添加所需节点后的新节点

C how to iterate and add a new node after a desired node in single Linked List

提问人:Heroking18 提问时间:10/4/2022 最后编辑:Vlad from MoscowHeroking18 更新时间:10/4/2022 访问量:140

问:

typedef struct ITEM {
  int value;
  struct ITEM *next;
}ITEM;

int add_after(ITEM *list, ITEM *c_item, int value)
{  
    ITEM *elem;

    //if head is NULL, it is an empty list
    if(c_item == NULL || list == NULL)
    {
        return -1;
    }

    //create a new node 
    elem = malloc(sizeof(ITEM));
    if(elem == NULL)
    {
      return -1;
    }
    elem->value = value;

    // iteration
    while(list != NULL)
    {
       if(list == c_item)
        {
          elem->next = list->next;
          c_item->next = elem;
          return 1;
        }
          list = list->value;
    }
    return 0;
}

它应该做什么:应该等于 .找到相等的节点后,它应该创建一个新节点并将该节点放在 的前面。c_itemlistelemc_item

我的代码的作用:是 HEAD 值并与该值进行比较,如果它不相同,则转到列表中的下一个。找到相等的节点后,它将节点添加到前面的列表中。listc_itemlistvalueelem

问题: 这仅适用于 中的 1 个现有节点。如果有 2 个节点,则它会卡在 .listlist = list->value;

// Linked List 10->20->30->NULL

//Input:
c_item = 20
elem = 100

//Output:
10->20->100->30->NULL
C 列表 按引用传递 singlely-linked-list 函数定义

评论

0赞 Vlad from Moscow 10/4/2022
c_item不是节点。因此,尚不清楚是否需要将一个值传递给函数,该值可以存在于列表中的节点中,或者是指向节点的指针。
0赞 Vlad from Moscow 10/4/2022
@ 如果您已经有指向链表 ITEM *c_item 中节点的指针,则只需编写 c_item->next = elem。指向头节点的指针是多余的,

答:

0赞 jxh 10/4/2022 #1

你似乎已经掌握了你想做的大部分事情的基础知识。让我们试着重新组织你的作品,也许你可以接近你想要的解决方案。

我会首先使用注释来描述我想在函数中完成什么。

int add_after (ITEM *list, ITEM *c_item, int value) {

    // Check c_item and list are not NULL
    // Check if c_item is in list
    // Create new elem with value
    // Add new elem after c_item

}

然后,我会编写完成这些事情的代码。

  • 检查c_item列表是否为 NULL
    if (! (c_item && list)) return -1;
  • 检查c_item是否在列表中
    if (! list_has_item(list, c_item)) return -1;
  • 创造具有价值的新 elem
    ITEM *elem = create_item(value);
    if (elem == NULL) return -1;
  • 在c_item后添加新的elem
    ITEM *old_after = c_item->next;
    c_item->next = elem;
    elem->next = old_after;

最后一点实际上是你问的具体问题。该实现会记住 之后的 ,使新元素位于它之后,然后将 过去 的 after 放在新元素之后。c_itemc_item

在没有临时的情况下,也可以使同样的事情发生。更清楚的是,还有什么值得商榷,但如果你好奇,可以尝试将上面的三行重写成两行。

我想你已经了解如何检查一个项目是否在列表中以及如何创建一个新项目,所以我将把这些留给你来实现。

评论

0赞 Heroking18 10/4/2022
嗨,很抱歉回复晚了,但我刚刚注意到这不是一个遍历列表的好代码,因为它基本上是指针 = int,这是错误的转换。 会给我一个.您如何迭代到列表而不会出现错误?list = list->value;list = list->next;NULL
0赞 jxh 10/4/2022
如果代码返回 0,则不在 中。for(;list && (list != c_item);list = list->next) {} return list;c_itemlist