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; }要怎么删除第一本书?
时间: 2023-08-03 15:02:38 浏览: 183
要删除第一本书,需要对链表头进行特殊处理。可以使用一个临时指针变量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);
// ...
```
相关问题
#include<stdio.h> #include<stdlib.h> struct l{ int a; struct l *next; }; struct l *creat() { struct l *head,*p1,*p2; int n,i; scanf("%d",&n); head=NULL; p1=(struct l *)malloc(sizeof(struct l)); scanf("%d",&p1->a); p1->next=NULL; head=p1; p2=p1; for(i=0;i<n-1;i++) { p1=(struct l *)malloc(sizeof(struct l)); scanf("%d",&p1->a);p1->next=NULL; p2->next=p1; p2=p1; } return head; } void printl(struct l *head) { struct l *p; p=head; while(p!=NULL); { printf("%d ",p->a); p=p->next; } } int main() { struct l *head; head=creat(); printl(head); return 0; },这个代码问题在哪
这段代码有两个问题:
1. 在 `printl` 函数中,while 循环的条件中多了一个分号,导致循环体中的语句无法执行,造成无法输出链表中的元素。
2. 在 `main` 函数中,调用 `creat` 函数后没有判断返回的链表头指针是否为 NULL,如果内存分配失败,会返回 NULL,此时调用 `printl` 函数会出现错误。
修改后的代码如下:
```c
#include<stdio.h>
#include<stdlib.h>
struct l{
int a;
struct l *next;
};
struct l *creat() {
struct l *head,*p1,*p2;
int n,i;
scanf("%d",&n);
head=NULL;
for(i=0;i<n;i++)
{
p1=(struct l *)malloc(sizeof(struct l));
if(p1 == NULL) {
printf("Memory allocation failed.\n");
exit(1);
}
scanf("%d",&p1->a);
p1->next=NULL;
if(head==NULL) {
head=p1;
p2=p1;
} else {
p2->next=p1;
p2=p1;
}
}
return head;
}
void printl(struct l *head) {
struct l *p;
p=head;
while(p!=NULL) // 去掉多余的分号
{
printf("%d ",p->a);
p=p->next;
}
}
int main() {
struct l *head;
head=creat();
if(head == NULL) {
exit(1);
}
printl(head);
return 0;
}
```
//动态链表 #include "stdio.h" #include "stdlib.h" #define LEN sizeof(struct Student) struct Student{ long num; float score; struct Student *next; }; int n; //全局变量 struct Student*creat(void) //建立链表 { //此函数无需放入形参 struct Student *head ,*p1,*p2; n=0; p1=p2=(struct Student *)malloc(LEN); scanf("%ld%f",&p1->num,&p1->score); while(p1->num!=0) //此处判断遇 0 代表结束 { n=n+1; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct Student *) malloc(LEN); scanf("%ld%f",&p1->num,&p1->score); } p2->next=NULL; return head; //返回值是链表头 } void del(struct Student *head) //删除结点 { struct Student *p1,*p2,*p; int k,a=n; printf("请输入要删除的结点:\n"); scanf("%d",&k); p1=head; while(n==a&&p1->next!=NULL) { if(head->num==k) //删除的是头结点 { p1=head; // 原头结点 p2= p1->next; // 新的头结点 free(p1); // 释放原头结点内存空间 head =p2; // 头指针向后移一位 n-=1; } p2=p1; p1=p1->next; if(p1->num==k) { p=p1->next; p2->next=p; n-=1; } } } void print(struct Student *head)//输出链表 { struct Student *p; p=head; printf("\nNow,These %d reconds are:\n",n); if(head!=NULL) do { printf("%ld %5.1f\n",p->num,p->score); p=p->next; }while(p!=NULL); } int main() { struct Student *pt; pt=creat(); del(pt); print(pt); return 0; }哪里有错误
代码中存在一个潜在的错误。当删除的是最后一个结点时,程序会陷入死循环,无法退出。具体来说,是由于在while循环中,当p1指向最后一个结点时,p1->next为NULL,但是判断条件却是p1->next!=NULL,导致循环无法结束。应该将判断条件改为p1!=NULL,这样当p1指向最后一个结点时,循环可以正常退出。修改后的代码如下:
```
void del(struct Student *head) //删除结点
{
struct Student *p1,*p2,*p;
int k,a=n;
printf("请输入要删除的结点:\n");
scanf("%d",&k);
p1=head;
while(n==a&&p1!=NULL)
{
if(head->num==k) //删除的是头结点
{
p1=head; // 原头结点
p2= p1->next; // 新的头结点
free(p1); // 释放原头结点内存空间
head =p2; // 头指针向后移一位
n-=1;
}
p2=p1;
p1=p1->next;
if(p1!=NULL && p1->num==k)
{
p=p1->next;
p2->next=p;
n-=1;
}
}
}
```
阅读全文