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; }为什么删除不了第一本书?
时间: 2024-03-24 07:35:37 浏览: 17
这段代码中的问题在于删除第一本书时没有正确处理头指针。如果要删除第一本书,则应该将头指针移动到第二本书,而不是直接删除第一本书。可以参考以下修改后的代码:
```
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 循环来查找要删除的书籍,然后将其从链表中删除。
相关问题
books* creat() { books* h; books* head; books* p1, * p2; int n = 0; int w; p1=(books*)malloc(LEN); printf("\tt\t我们先创建图书表\n\n"); printf("请输入序列号:"); scanf("%d", &p1->id); printf("请输入年份:"); scanf("%d", &p1->year); printf("请输入作者:"); scanf("%s", &p1->author); printf("请输入书名:"); scanf("%s", &p1->name); head = p1; head->next = NULL; printf("\n\n请按下面数字选择:\n\n"); printf(" 1.继续 2.结束"); printf("\n请选择:"); scanf("%d", &w); p2 = head; while (w == 1) { p1 = (books*)malloc(LEN); printf("请输入序列号:"); scanf("%d", &p1->id); printf("请输入日期:"); scanf("%d", &p1->year); printf("请输入作者:"); scanf("%s", &p1->author); printf("请输入书名:"); scanf("%s", &p1->name); p2->next = p1; p1->next = NULL; p2 = p2->next; printf("\n\n请按下面数字选择:\n\n"); printf(" 1.继续 2.结束"); printf("\n请选择:\n"); scanf("%d", &w); } return head; }要怎么删除第一本书?
要删除第一本书,需要对链表头进行特殊处理。可以使用一个临时指针变量temp指向头节点,然后将头节点指向下一个节点,最后释放temp指向的节点即可删除第一本书。代码如下:
```
void delete_first_book(books* head) {
books* temp = head;
head = head->next;
free(temp);
printf("删除成功!\n");
}
```
需要注意的是,在调用该函数时,需要传入链表头的指针,例如:
```
books* head = create();
// ...
delete_first_book(head);
// ...
```
一本书的信息包括:书的ID,书名,价格。 请定义结构体类型表示书的信息并建立链表存储 若干本书籍。当输入ID为-1时表示输入结束。 输入110查找是否有该ID的书籍,若有,打印该 书的书名和价格。若无,则提示无此书。 删除一个已有书籍ID的相关信息。 插入一本书(111,"C Programming",32.5)到链表中 (假设链表中书的ID已有序并按照从小到大顺序) ,之后打印整个链表,显示该书信息已被正确插 入至链表。c语言写程序
以下是实现上述功能的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义书的信息结构体
struct Book {
int id;
char name[50];
float price;
struct Book *next;
};
// 查找指定ID的书籍
struct Book *find_book(struct Book *head, int id) {
struct Book *p = head;
while (p != NULL) {
if (p->id == id) {
return p;
}
p = p->next;
}
return NULL;
}
// 删除指定ID的书籍
void delete_book(struct Book **head, int id) {
struct Book *p = *head;
struct Book *prev = NULL;
while (p != NULL) {
if (p->id == id) {
if (prev == NULL) {
*head = p->next;
} else {
prev->next = p->next;
}
free(p);
printf("删除成功!\n");
return;
}
prev = p;
p = p->next;
}
printf("无此书!\n");
}
// 插入一本书
void insert_book(struct Book **head, int id, char *name, float price) {
struct Book *new_book = (struct Book *)malloc(sizeof(struct Book));
new_book->id = id;
strcpy(new_book->name, name);
new_book->price = price;
new_book->next = NULL;
struct Book *p = *head;
struct Book *prev = NULL;
while (p != NULL && p->id < id) {
prev = p;
p = p->next;
}
if (prev == NULL) {
new_book->next = *head;
*head = new_book;
} else {
prev->next = new_book;
new_book->next = p;
}
printf("插入成功!\n");
}
// 打印所有书籍信息
void print_books(struct Book *head) {
struct Book *p = head;
printf("ID\t书名\t\t价格\n");
while (p != NULL) {
printf("%d\t%s\t\t%.2f\n", p->id, p->name, p->price);
p = p->next;
}
}
int main() {
struct Book *head = NULL;
int id;
char name[50];
float price;
// 循环读入书籍信息并插入链表
while (1) {
printf("请输入书的ID(-1表示输入结束):");
scanf("%d", &id);
if (id == -1) {
break;
}
struct Book *book = find_book(head, id);
if (book != NULL) {
printf("已有该书,书名为%s,价格为%.2f元。\n", book->name, book->price);
continue;
}
printf("请输入书名:");
scanf("%s", name);
printf("请输入价格:");
scanf("%f", &price);
insert_book(&head, id, name, price);
}
// 查找书籍
printf("请输入要查找的书的ID:");
scanf("%d", &id);
struct Book *book = find_book(head, id);
if (book != NULL) {
printf("书名:%s,价格:%.2f元。\n", book->name, book->price);
} else {
printf("无此书!\n");
}
// 删除书籍
printf("请输入要删除的书的ID:");
scanf("%d", &id);
delete_book(&head, id);
// 插入一本新书
insert_book(&head, 111, "C Programming", 32.5);
// 打印所有书籍信息
print_books(head);
return 0;
}
```
注:上述代码中,使用了双重指针(`struct Book **head`)来表示链表头指针,这样可以在函数内部修改链表头指针的值,达到修改链表的目的。
阅读全文