我明天在数据结构中考试,我想在这段代码中找出插入函数。请问您能在函数Insert
中向我解释为什么temp->next = head
?
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
struct Node* head;
void Insert(int x) {
struct Node *temp = (struct Node*)malloc(sizeof(struct Node));
temp->data = x;
temp->next = NULL;
if(head != NULL) { temp->next = head;}
head = temp;
}
void Print() {
struct Node* temp = head;
printf("List is: ");
while(temp != NULL) {
printf(" %d",temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
head = NULL;
Insert(1);
Insert(2);
Insert(3);
Insert(4);
Insert(5);
Print();
return 0;
}
答案 0 :(得分:1)
根据你的评论 -
“但是当我们删除这部分时为什么程序不起作用?是吗? 保留旧头的地址打印清单?
不,不是。因为这里......
if(head != NULL) { temp->next = head;}
head = temp;
...我们看到,如果我们删除head = temp;
您将会删除您的列表,因为如果head == NULL
它仍然是NULL
。如果没有,则您没有指向temp
的链接,因此您孤立temp
以及所有其他insert
。
if(head != NULL) { temp->next = head;}
语句确保,如果您做有一个,您的列表会附加到新的head
,但如果没有head = temp;
语句则不会物质
答案 1 :(得分:0)
void Insert(int x) {
struct Node *temp = (struct Node*)malloc(sizeof(struct Node));
temp->data = x;
temp->next = NULL;
if(head != NULL) { temp->next = head;}
head = temp;
}
让我们看一下例子: -
insert(1);
将创建新节点并将其数据字段设置为1.然后它检查head是否为NULL。是的,因为这是我们插入的第一个元素。所以它突出了这个元素。这意味着在此之后
head -> 1
现在你做
insert(2);
在同一行上它将创建节点以容纳2.接下来它检查head是否为NULL。它不是那么执行
temp->next = head;
表示临时节点(即2)接下来将指向head(现在为1)。在此声明之后
2 -> 1 (head)
然后你执行
head = temp;
这将使头部指向2(新创建的节点)
(head) 2->1
通过这种方式,您将继续添加元素并保持头指针指向添加到列表中的最新元素。这将帮助您稍后使用头指针遍历列表。
答案 2 :(得分:0)
通过替换头部,在列表的前面插入新节点。新头将是新分配的节点temp
,旧头将是列表中的第二个节点,因此temp->next
。
这些概念可以通过铅笔和纸张的帮助轻松想出来。或者使用ASCII草图,其中->
表示通过next
指针的链接,|
表示指向不是节点链接的节点的直接指针:
head
|
3 -> 2 -> 1 -> NULL
插入4后,但在分配新头之前:
temp head
| |
4 -> 3 -> 2 -> 1 -> NULL
分配新头后:
head
|
4 -> 3 -> 2 -> 1 -> NULL
现在您有了一个正确的列表,您可以通过head
和next
指针访问所有添加的节点。如果您没有重新签名head
,则只能访问旧节点。
这也适用于head == NULL
的空列表,但您无法访问head->next
。
答案 3 :(得分:0)
在链接列表中添加新元素后会发生这种情况。当你添加新元素时,你必须将新元素作为头部,所以你必须指向前一个头作为链表中的下一个项目。