在链表中插入
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==NULL
则temp==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()'(推荐)初始化保证将不适用,您的程序会神秘地出现段错误。以上是关于在链表中插入的主要内容,如果未能解决你的问题,请参考以下文章