【问题标题】:how to insert node in Circular Linked list in C如何在C中的循环链接列表中插入节点
【发布时间】:2020-09-17 16:06:39
【问题描述】:

有人可以解释代码的“while 部分”吗?- 在 main() 头中声明为结构节点指针,初始化为 NULL。并通过调用 function = push(&head,12) 插入一个节点

void push(struct Node **head_ref, int data)
{ 
    struct Node *ptr1 = (struct Node *)malloc(sizeof(struct Node)); 
    struct Node *temp = *head_ref; 
    ptr1->data = data; 
    ptr1->next = *head_ref; 
    if (*head_ref != NULL) 
    { 
        while (temp->next != *head_ref)
            temp = temp->next; 
        temp->next = ptr1; 
    }
    else
        ptr1->next = ptr1; /*For the first node */

    *head_ref = ptr1;
}

【问题讨论】:

  • 在下面的答案中,我试图解决您的问题,但如果还不够,请在有任何问题的评论中标记我 (@ryyker) :))
  • 循环链表中缺少指向最后一个节点的指针(由双向链表中的->prev指针提供)要求添加新的第一个节点后,必须遍历整个列表找到最后一个节点并更新->next 指针,使其指向新的第一个节点。 (课程:始终保留 tail 指针或将列表设为 doubly-linked 列表以保留 O(1) 插入)

标签: c linked-list circular-list


【解决方案1】:

有人能解释一下代码的“while 部分”吗?

while() 部分(也在下面的2.) 部分中描述。)是寻找指向当前头节点的节点,以便新节点 可以在它之前插入。在循环中,注意当节点找到时,它们还不是头节点,它们被递增,以便在头时为插入做准备节点终于找到了。

例程中的最后一个表达式:

*head_ref = ptr1;

是在下面的一般步骤中处理1.)部分描述的情况。

以下初始条件的一般方法:

  1. 链接列表为空:
    a) 由于 new_node 是 CLL 中的唯一节点,因此创建一个自循环。
    新节点->下一个 = 新节点;
    b) 改变头指针指向新节点。 *head_ref = new_node;
  2. 新节点将插入到头节点之前:
    (a) 使用循环找出最后一个节点。 而(当前->下一个!= *head_ref) 当前=当前->下一个; (b) 更改最后一个节点的下一个。 当前->下一个=新节点; (c) 将新节点的 next 更改为指向 head。 新节点->下一个 = *head_ref; (d) 改变头指针指向新节点。 *head_ref = new_node;
  3. 新节点将被插入到头部之后的某处: (a) 找到要插入新节点的节点。 while ( current->next!= *head_ref && 当前->下一个->数据数据) {当前=当前->下一个; } (b) 使 new_node 的 next 成为定位指针的 next 新节点->下一个 = 当前->下一个; (c) 改变定位指针的下一个 current->next = new_node;

此操作的详细信息和实现在此example code中显示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2020-02-18
    • 2015-10-20
    • 1970-01-01
    • 2016-03-30
    • 2019-04-26
    相关资源
    最近更新 更多