gpt4 book ai didi

c - 从单个链接列表中删除学生记录

转载 作者:行者123 更新时间:2023-11-30 20:35:41 25 4
gpt4 key购买 nike

这是我编写的用于删除链接列表中特定学生记录的代码:

int delete ( struct student **q, struct student s,char *n ) {
if(*q==NULL)
{
printf("The linked list is empty\n");
return 0;
}
struct student *prev=*q;
while(prev->link!=NULL && prev->link!=n)
{
prev=prev->link;
}
if(prev->link==NULL)
{
printf("Student %s not found\n",n);
return 0;
}
prev->link=prev->link->link;
free(n);
return 1;
}

但是我收到一条警告消息,告诉不同指针类型的比较缺少 while 语句的强制转换[默认启用]while(prev->link!=NULL && prev->链接!=n)

这是结构:

struct student
{
int id;
char name[10];
char gender[10];
struct student * link;
}*head;

n存储必须删除的学生的姓名。

最佳答案

您的代码中有很多东西并没有真正发挥作用。

我认为您想从链接列表中删除与 char* n 匹配的整个结构。

您无法比较 char*n 和结构,因此此循环不正确:

while(prev->link!=NULL && prev->link!=n)
{
prev=prev->link;
}

您需要检查第一个是否与您的字符串不匹配,否则它将保留。如果第一个匹配,则需要重新分配结构的开头,因此您将在函数的声明中使用 **q (确保正确影响它)。第一个检查如下所示:

struct student *prev = *q;
if (strcmp(prev->name, n) == 0)
{
*q = (*q)->link;
prev->link = NULL; //not compulsory, but a good habit to take
free(prev);
}

我会这样编写循环:

while(prev->link != NULL && strcmp(prev->link->name, n) != 0))
{
prev = prev->link;
}

在 C 语言中,需要使用 strcmp() 来比较两个字符串。不匹配的“if”将保持相同。

然后,您会遇到一些内存分配问题。您不能释放固定指针(例如 name[10]),而只能释放分配的内存。所以最后,在不匹配的 if 之后,我建议使用一个“else”,如下所示:

else
{
struct student matched_student = prev->link;
prev->link = prev->link->link;
matched_student->link = NULL;
free(matched_student);
}

关于c - 从单个链接列表中删除学生记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38349746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com