【问题标题】: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 终止

标签: c data-structures linked-list


【解决方案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()'(推荐)初始化保证将不适用,您的程序会神秘地出现段错误。
    猜你喜欢
    • 2018-07-28
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2013-02-28
    • 2016-06-04
    相关资源
    最近更新 更多