C链接列表:如何在前面插入节点

时间:2016-04-10 10:27:56

标签: c insert linked-list

在教科书" 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

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

3 个答案:

答案 0 :(得分:2)

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

from wikipedia 图片:英语维基百科的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;
}

答案 1 :(得分:2)

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

  • 将指针隐藏在typedef后面是令人困惑的,而且样式不好
  • 投射malloc()不需要返回值,有潜在危险,风格不好
  • 不需要sizeof后的括号
  • 函数 design 很奇怪:传递三个args只需要两个args,返回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;
   }
}

答案 2 :(得分:0)

我更改了函数,因此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;
   }
}