这是我为删除链接列表中的特定学生记录而编写的代码:
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;
}
但是我收到一条警告消息告诉comparison of distinct pointer types lacks a cast [enabled by default]
有关while语句while(prev->link!=NULL && prev->link!=n)
这是结构:
struct student
{
int id;
char name[10];
char gender[10];
struct student * link;
}*head;
和n
存储了必须删除的学生的姓名。
答案 0 :(得分:0)
我认为prev->link
的类型为struct student *
,但n
的类型为char *
,这些类型不同,因此您可以使用
static_cast<char *>(prev->link) != n
或
(char *)(prev->link) != n
修正警告。
答案 1 :(得分:0)
你的代码中有很多东西没有真正起作用。
我想你想从链表中删除与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()来比较两个字符串。 不匹配&#34;如果&#34;然后会保持一致。
然后,您在内存分配方面遇到了一些问题。你不能释放固定指针(例如名称[10]),但只能释放malloced内存。 所以最后,在不匹配之后,我建议一个&#34;否则&#34;看起来像是:
else
{
struct student matched_student = prev->link;
prev->link = prev->link->link;
matched_student->link = NULL;
free(matched_student);
}