【发布时间】:2020-07-14 14:38:59
【问题描述】:
我不知道为什么 head = head->next 在我们没有存储任何内容或 NULL 在 head->next 中时有效
这是两个函数
第一个函数采用int 类型的参数n 并在此函数中创建列表,我们定义为head->next = NULL
第二个函数,即deletefirstnode删除第一个节点,但在这个函数中head->next确实有效并指向列表中的另一个节点,我们使用temp->next访问下一个节点,但为什么在这种情况下head->next
请有人帮我解释一下
void createlist(int n){
struct node *newnode, *temp;
int data, i;
head = (struct node*)malloc(sizeof(struct node));
if(head == NULL){
printf("unable to allocate memory");
}
else{
printf("enter the data of node 1 : ");
scanf("%d", &data);
head->data = data;
head->next = NULL;// here is where we define head->next to NULL
temp = head;
for(i=2; i<=n; i++){
newnode = (struct node*)malloc(sizeof(struct node));
if(newnode == NULL){
printf("unble to allocate memory");
}
else{
printf("enter the data of node %d", i);
scanf("%d", &data);
newnode->data = data;
newnode->next = NULL;
temp->next = newnode;
temp = temp->next;
}
}
printf("singly linked list created successfully\n");
}
}
void deletefirstnode(){
struct node *todelete;
if(head == NULL){
printf("list is already empty");
}
else{
todelete = head;
head = head->next;//and why this works now I am confused
printf("\ndata deleted = %d\n", todelete->data);
free(todelete);
printf("successfully deleted the first node from list\n");
}
}
【问题讨论】:
-
head = head->next;- 为指针赋值。问问自己head在赋值操作之前和之后指的是什么。不要用深刻的思想把它复杂化。说出最先想到的事情。然后,使用调试器单步执行您的程序,检查变量值,看看您是否正确。 -
head在else的情况下不是NULL。因此,head->next有效;head->next可能指向一个有效地址或NULL。您询问的代码的目的是删除当前的head并将下一行(如果有)提升为head。 -
指向和存储是完全不同的,我认为你在使用指针时应该更多地考虑指向而不是存储
-
欢迎来到 SO。这类关于链表管理的问题最好从纸笔开始。在纸上画出节点应该很有用。
-
@Rahul Magar 解释为什么这个 head = head->next 在你看来不起作用。
标签: c data-structures linked-list null