head->next=p;和head=p->next的区别
时间: 2024-06-01 20:08:03 浏览: 112
这两行代码的区别在于它们改变了链表中节点的连接方式。
假设有一个链表,其中head是头节点的指针,p是一个新的节点指针。
- head->next = p 将新节点p插入到头节点head之后,使得新节点p成为新的头节点的下一个节点。
- head = p->next 将头节点head指向p的下一个节点,也就是将p节点从链表中删除,并将链表的头节点指向p的下一个节点。
因此,这两个语句的效果完全不同,需要根据实际情况来选择使用哪个语句。
相关问题
books* books_delete(books* head) { int id; books* p, * q; p = head; printf("请输入你的序列号:"); scanf("%d", &id); if (p->id == id) { head = p->next; free(p); } else { while (p->next) { q = p->next; if (q->id == id) { p->next = q->next; free(q); break; } p = p->next; } } return head; }为什么删除不了第一本书?
这段代码中的问题在于,第一本书的删除逻辑没有考虑到头指针的变化。当要删除头节点时,需要更新头指针指向链表的第二个节点,否则头节点就无法被删除。
以下是修改后的代码,可以正确地删除第一本书:
```
books* books_delete(books* head) {
int id;
books* p, * q;
p = head;
printf("请输入你的序列号:");
scanf("%d", &id);
if (p->id == id) {
head = p->next;
free(p);
}
else {
while (p->next) {
q = p->next;
if (q->id == id) {
p->next = q->next;
free(q);
break;
}
p = p->next;
}
}
return head;
}
```
在修改后的代码中,当要删除头节点时,我们更新头指针 `head` 指向链表的第二个节点,这样可以正确地删除第一本书。
void Inverse(struct node* head) { struct node* p = head; struct node* q = head; struct node* m = head; while (p->next) { p = p->next; if (q == head) q->next = NULL; m = p->next; p->next = q; m->next = p; q = m; p = m; } p->next = q; }
您提供的代码存在一些问题,无法正确地完成链表的逆置。在代码中,您使用了三个指针变量p、q和m来进行链表节点的重新连接。但是,您在更新节点的指针时出现了一些错误。
以下是对您提供的代码进行修正后的版本:
```c
void Inverse(struct node* head) {
struct node* prev = NULL;
struct node* curr = head;
struct node* next = NULL;
while (curr != NULL) {
next = curr->next; // 保存下一个节点
curr->next = prev; // 当前节点指向前一个节点
prev = curr; // 前一个节点更新为当前节点
curr = next; // 当前节点更新为下一个节点
}
// 更新链表的头节点
head = prev;
}
```
修正后的代码使用了三个指针变量prev、curr和next来进行节点的重新连接。循环遍历链表,每次将当前节点的指针指向前一个节点,并依次更新三个指针变量。最后,将链表的头节点更新为prev,以完成链表的逆置操作。
请注意,在修正后的代码中,我将函数参数名从p、q和m更改为了prev、curr和next,以提高代码的可读性。另外,请确保在调用该函数时传入正确的链表头节点。
阅读全文