-1
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;
}

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

4

1 回答 1

2

恕我直言,此链接是链表的主要介绍。

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

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

然后在a你的第一个链接之后立即插入NEW : NEW ==> b (这是第一个,因为如果你先重置a的指针,你将很难到达b

然后将 a 链接到NEW就像... a ==> NEW ... 所以我们有a ==> NEW ==> b ==> c ==> NULL


为此,节点中必须有指针......类似于:

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

如您所见,节点的精确定义并不重要,只要它包含指向另一个节点的指针即可。


curr指向当前节点......所以要获得“上一个”,您可以创建一个指向另一个节点的免费指针,正如我假设 NODE* pre在您的问题中一样。

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

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

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在单链表中需要使用的节点之前进行设置。

于 2013-03-23T20:19:46.740 回答