如何在C中间插入节点

时间:2013-03-23 20:10:46

标签: c linked-list

NODE* insertNode (NODE* head, NODE* pre, DATA item)
{
//Local Declaration
NODE* curr;

//Statement
if (!(curr = (NODE*)malloc(sizeof(NODE)))
    printf("\amemory overflow in insert\n");

curr->data = item;
if (pre == NULL)
{
   //inserting before first node or to empty list
   curr->next = head;
   head = curr;
}
else 
{
   //inserting in middle or at the end
   curr->next = pre->next;
   pre->next = curr;
}

return head;
}

这是我根据我正在阅读的书在现有列表中间插入节点的方法。但是,它并没有真正告诉我这里如何定义prepre指向前一个节点。)如何定义pre指针以使其指向前任节点?

1 个答案:

答案 0 :(得分:2)

This link是恕我直言,链接列表的主要介绍。

本书所说明的是“三步链接”......

假设{a,b,c}是结构/节点,使得 a ==> b ==> c ==> NULL

然后在第一个链接 a 之后立即插入 ==> b (首先,因为如果您首先重置 a 的指针,那么您将很难找到 b

然后将a链接到,例如... a ==> ...所以我们 a ==> ==> b ==> c ==> NULL


要做到这一点,节点必须有指针......类似于:

struct node{
  int i;
  struct node* next; // this is the value that will be changed
};

如您所见,节点的精确定义无关紧要,只要它包含指向另一个节点的指针。


curr指向当前节点...所以要获得“previous”,您可以创建一个免费指针到另一个节点,我认为 NODE* pre就在您的问题中。

但实际上,这是不必要的,因为只使用->运算符比使用多个指针要简单得多。您也可以使用它指向其他节点。

因此,对于我的{a,b,c}示例,假设abc都是唯一的struct node,如前所示连接。< / p>

struct node* curr = a;   // a pointer to the head of the list
struct node NEW = malloc(sizeof(struct node)); // make a new node

NEW->next = curr->next;  // set NEW's next to point to b through `curr->next`
/* note that defining previous isn't necessary, b/c it is defined @ curr->next */
curr->next = NEW;        // set curr (a) to point to NEW instead of b

请记住在单个链接列表中需要使用的节点之前设置curr