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; }为什么删除不了第一本书?
时间: 2024-02-14 22:16:41 浏览: 133
这段代码中的问题在于,第一本书的删除逻辑没有考虑到头指针的变化。当要删除头节点时,需要更新头指针指向链表的第二个节点,否则头节点就无法被删除。
以下是修改后的代码,可以正确地删除第一本书:
```
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` 指向链表的第二个节点,这样可以正确地删除第一本书。
相关问题
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 == NULL) {
printf("链表为空!");
return head;
}
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;
}
```
在修改后的代码中,我们添加了对头节点为空的判断,并且在删除第一本书时也正确处理了头指针的变化。
void books_delete(books* head) { int id; books* p, * q; p = q = (books*)malloc(LEN); p = head; printf("请输入你的序列号:"); scanf("%d", &id); if (p->id == id) { p->next = p->next->next; free(p); } else { q = p->next; p->next = p->next->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;
}
```
在这个修改后的代码中,我们通过修改头指针的方式来删除第一本书。并且在删除其他书籍时,我们使用了 while 循环来查找要删除的书籍,然后将其从链表中删除。
阅读全文