改良代码struct link * liu(struct link *head) { struct link *pr=head,*p=head; if(head==NULL) { printf("链表为空\n"); exit(0); } char b[10]={'\0'}; printf("请输入要删除的书名\n"); scanf("%s",b);fflush(stdin); while(p!=NULL) { if(strcmp(p->book,b)==0) { if(p==head) {printf("登录号 分类号 出版时间 价格 书名 作者名 出版单位\n"); printf("%-8d%-8d%-10d%-8d%-25s%-15s%-s\n",p->data,p->kindofnumber,p->time,p->price,p->book,p->writer,p->publisher); head=p->next; free(p);break; } else { pr->next=p->next;free(p);break; } } pr=p; p=p->next; } return (head); }
时间: 2024-02-01 08:03:08 浏览: 70
create_linklist_head.rar_Create_LinkList c++_head_头插法
这段代码是一个删除链表节点的函数,根据输入的书名b进行匹配,如果匹配到则删除对应节点。但是有几个需要改进的地方:
1. 输入的书名b的长度最好不要超过9个字符,否则会导致数组越界。
2. fflush(stdin)不是标准的写法,不同的编译器可能会有不同的实现。可以考虑用getchar()来清空输入缓冲区。
3. 在删除节点之前最好先判断一下链表是否为空,否则会出现访问空指针的情况。
改进后的代码如下:
```
struct link * liu(struct link *head) {
if(head == NULL) {
printf("链表为空\n");
return head;
}
char b[100] = {'\0'}; // 改为100,避免数组越界
printf("请输入要删除的书名\n");
scanf("%s", b);
getchar(); // 清空输入缓冲区
struct link *pr = head, *p = head;
while(p != NULL) {
if(strcmp(p->book, b) == 0) {
printf("登录号 分类号 出版时间 价格 书名 作者名 出版单位\n");
printf("%-8d%-8d%-10d%-8d%-25s%-15s%-s\n", p->data, p->kindofnumber, p->time, p->price, p->book, p->writer, p->publisher);
if(p == head) {
head = p->next;
free(p);
} else {
pr->next = p->next;
free(p);
}
break;
}
pr = p;
p = p->next;
}
return head;
}
```
阅读全文