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

时间:2016-07-13 10:58:53

标签: c

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

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存储了必须删除的学生的姓名。

2 个答案:

答案 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);
}