【问题标题】:C Linked List : How to insert node at frontC链表:如何在前面插入节点
【发布时间】:2016-04-10 10:27:55
【问题描述】:

在《C 语言数据结构基础》教科书中, (由 Horowitz Sahni Anderson-Freed 撰写)

他们提供以下代码

作为插入节点的方法

在链表中的某个任意节点 x 之后:

void insertNode(nodePtr *listPtr, nodePtr insertLoc, int data)
{
   nodePtr temp = (nodePtr)malloc(sizeof(*temp));
   temp->data = data;
   if(*listPtr) // not empty
   {
       temp->next = insertLoc->next;
       insertLoc->next = temp;
   }
   else //empty
   {
       temp->next = NULL;
       *listPtr = temp;
   }

}

因此,以下调用将导致:

nodePtr head = NULL; insertNode(&head,head,10); // 10 insertNode(&head,head,20); // 10 -> 20 insertNOde(&head,head,30); // 10 -> 30 -> 20

我的问题: 如何在列表的前面插入一个节点?

【问题讨论】:

  • 没有给定的功能。 (显而易见的方式是temp->next = *head; *head = temp;
  • @wildplasser 我知道评论发布后很长时间了,但是你怎么把 *head (这是一个节点)分配给 temp->next(这是一个 nodePtr) ,不是这两个不兼容?

标签: c insert linked-list


【解决方案1】:

本书中的功能完全是疯狂的,恕我直言。 (也许这本书是关于 C++ 的?)

  • 将指针隐藏在 typedef 后面会令人困惑,而且样式不好
  • 不需要强制转换 malloc() 的返回值,有潜在危险,而且风格不好
  • sizeof 后面的括号不是必须的
  • 函数 design 很奇怪:在只需要两个的地方传递三个参数,返回 void。

可以在顶部插入的一个可能的替代函数是在条件中使用 insertLoc 而不是 listPtr:

void insertNode(nodePtr *listPtr, nodePtr insertLoc, int data)
{
   nodePtr temp = malloc(sizeof *temp );
   temp->data = data;
   if (insertLoc) // Position requested
   {
       temp->next = insertLoc->next;
       insertLoc->next = temp;
   }
   else // No: insert at top
   {
       temp->next = *listPtr;
       *listPtr = temp;
   }
}

【讨论】:

  • 不,不需要。如果 *head == NULL,赋值 temp->next = *head; 将有效地将 temp->next 设置为 NULL。 -->> 您不需要特殊情况,例如在您的答案中。
  • 好吧,你是对的,我没有看到技巧 temp->next = *listPtr;马上,但至少如果你用 head = NULL 和 insertLoc != NULL 打电话,他们会做一些不同的事情;-)
【解决方案2】:

链表是一种非常简单的数据结构,其中每个节点都包含一个有效负载(在您的情况下为 int)和一个指向下一个节点的指针。该列表由一个指向特殊“NIL”节点的指针终止,在 C 中通常只是一个 NULL 指针。

图片:Yonkeltron 在英语维基百科

要添加到列表中,您只需创建一个新节点并将其 NEXT 指针分配给前一个节点。

另外,不要忘记检查 malloc 的返回值。或者使用 glib 中的 g_malloc 自动执行此操作。

nodePtr cons(nodePtr tail, int data)
{
  nodePtr head = malloc(sizeof(*nodePtr));
  assert(head);
  head->data = data;
  head->next = tail;
  return head;
}

【讨论】:

    【解决方案3】:

    我改变了函数,所以一个 NULL insertLoc 意味着作为头部插入

    void insertNode(nodePtr *listPtr, nodePtr insertLoc, int data)
    {
       nodePtr temp = (nodePtr)malloc(sizeof(*temp));
       temp->data = data;
       if(*listPtr) // not empty
       {
        if (!insertLoc) {
            temp->next = *listPtr;
            *listPtr = temp;
        } else {  
           temp->next = insertLoc->next;
           insertLoc->next = temp; 
        }
       }
       else //empty
       {
           temp->next = NULL;
           *listPtr = temp;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2021-05-25
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多