在链表中插入

Posted

技术标签:

【中文标题】在链表中插入【英文标题】:Insertion in Linked list 【发布时间】:2015-02-10 12:57:22 【问题描述】:

我正在研究如何在开头插入节点,我通过了这段我无法理解的代码。我没有得到打印功能。

typedef struct node

    int data;
    struct node *next;
 Node;
Node *head;
void insert(int x)

    Node *temp=(Node*)malloc(sizeof(Node));   
    temp->data=x;
    temp->next=head;
    head=temp;

void print()

    Node *temp=head;
    printf("List is:");
    while(temp!=NULL) //Unable to understand this statement as how will the loop terminate?                  
    
        printf("%d ",temp->data);
        temp=temp->next;
    
    printf("\n");

【问题讨论】:

temp=temp->next; 行更改 temp,在列表末尾的 next 指向 NULL,因此条件 temp!=NULL 不再为真 请正确缩进您的代码。 在调试器中运行,逐行执行代码,看看会发生什么。 所以“下一个”最后会自动初始化为 NULL,因为我没有在任何地方将它初始化为 NULL。 没有自动魔法。您找到的代码假定列表为 NULL 终止 【参考方案1】:

假设你的链表看起来像

a->b->c->d
|
|
head

所以现在我们使用一个临时变量

temp = head;

while(temp != NULL)

  //Keep moving temp
  printf("%d\n",temp->x);
  temp = temp->next;

所以head永远不会移动,它只是移动到列表末尾的临时指针,当我们到达temp = NULL时,列表的末尾就得到了

a->b->c->d
|
|
temp = head

temp = temp->next;

    a->b->c->d
    |  |
    |  |
  head temp

重复上述移动直到temp = NULL,当打印最后一个节点内容时为真,我们执行temp = temp->next;

【讨论】:

但是我在哪里初始化它是 Null? @Beginner 您没有将其初始化为 NULL。您最初创建temp=head,当访问最后一个节点时,您拥有的是temp->next = NULL,所以我们分配temp = temp->next (= NULL) 好的,现在我在遍历它之后得到它,最后下一个指针不指向任何元素,所以它是 NULL。【参考方案2】:

C 程序需要一个 main 函数开始。如果你想测试上面的代码,你需要添加一个main函数,在开始时将head初始化为NULL,调用insert()几次,print()查看结果。

【讨论】:

【参考方案3】:

问题上的缩进是一团糟。

但是打印功能是:

  void print() 
      Node *temp=head;             
      printf("List is:");         
      while(temp!=NULL)          
          printf("%d ",temp->data);
          temp=temp->next;
      
   

如果head==NULLtemp==NULL 在开始,循环将立即终止。

如果head!=NULL,那么temp!=NULL在开头,将输出头元素的数据。

temp=temp->next; 行将使temp 指向列表中的下一个Node,循环将继续进行。 如果列表中只有Node,则循环将终止。

否则它将打印下一个元素的数据,并且temp=temp->next 行将移动到第三个Node(如果有)。

等等……

注意: 不推荐使用Node *head; 行。它将被初始化为NULL,因为它具有静态存储持续时间。但建议使用Node *head=NULL; 以保证未来的安全性和可读性。

【讨论】:

@初学者。例如,您提出了“但我在哪里初始化它是 Null?”的问题。如果该行显示为“Node *head=NULL;”,NULL 的来源不是更清楚吗?我认同。 'C' 中关于初始化的规则并不简单,几乎所有其他数据都没有初始化。这使得出错或做出破坏代码的更改变得容易。如果您移动了“节点 *head;”进入'main()'(推荐)初始化保证将不适用,您的程序会神秘地出现段错误。

以上是关于在链表中插入的主要内容,如果未能解决你的问题,请参考以下文章

使用java在链表中插入节点

如何在链表中的另一个节点之间插入一个节点?

使用双指针在链表之间插入新节点

在链表C++中的某个位置插入节点

在链表指定位置插入结点

Leetcode刷题100天(阿里云周赛)—在排序链表中插入一个节点(链表)—day42