月昤昽 2024-11-03 13:05 采纳率: 0%
浏览 3
已结题

关于#链表#的问题,请各位专家解答!(语言-c语言)



```c

​
int deletestu(int flag)
{
    system("cls");
     FILE* fp = fopen("stusys.txt","r");  //打开stusys文本文件
    if(fp == NULL)
    {
        tip();            //是否主动退出
        return -1;
    }
        stulist* stl = (stulist*)malloc(sizeof(stulist));  //为stl开辟空间
    if(stl == NULL)
    {
        fclose(fp);
        tip();            //是否主动退出
        return -1;
    }
    stl->next = NULL;

    stulist* head = stl;
    int frist = 0;
    while(fscanf(fp,"%d%s%d%s%f", &stl->stu_num, stl->name, &stl->age, stl->class, &stl->grade) != EOF)        //迭代读取文件内容直至文件
    {
        if (frist == 1)
        {
            head->next = stl;        //为什么要有这个,head指针的内容不是会随着stl指针更新而更新吗?希望有大佬看到解释一下
        }
        frist++;
        stl = stl->next;
            if(stl == NULL)
            {   
            stl = (stulist*)malloc(sizeof(stulist));
            if(stl == NULL)
            {
                fclose(fp);
                tip();            //是否主动退出
                return -1;
            }
            stl->next = NULL;
            }
    }
    stl =NULL;
    fclose(fp);
        fp = fopen("stusys.txt","w");  //打开stusys文本文件
    if(fp == NULL)
    {
        tip();            //是否主动退出
        return -1;
    }
    int flagend = 0;
        stl = head;            //将学生信息链表的头节点传递给stl指针
    while(stl != NULL)        //遍历链表,将除要删除的学生信息之外的其他学生信息重新写入
    {
        if(stl->stu_num == flag)
        {
            printf("\t\t\t学号\t\t姓名\t\t年龄\t\t班级\t\t成绩\n");                            //打印要删除学生的信息
            printf("\t\t\t%-16d%-16s%-16d%-16s%-16f\n", stl->stu_num, stl->name, stl->age, stl->class, stl->grade);
            stl = stl->next;
            flagend++;
            continue;
        }
        
        fprintf(fp, "%d %s %d %s %f\n", stl->stu_num, stl->name, stl->age, stl->class, stl->grade);
        stl = stl->next;
     }
    if(flagend)
    {
        end("信息已删除");
    }
    else if(flagend == 0)
    {
        end("系统内无该学生信息");
    }
    free(stl);
    fclose(fp);    
    return 0;
}

​

```

  • 写回答

1条回答 默认 最新

  • 香格里辣 2024-11-03 13:06
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你提供的代码中看到,这是一个关于学生信息管理系统的部分功能,它主要从一个文件中读取学生信息,然后根据提供的学号删除对应的学生信息。关于你提到的 head->next = stl; 这一行代码的作用,我来解释一下。

    首先,你的链表是由一个个 stulist 结构体组成的,每个结构体都保存了一个学生的信息,并且有一个 next 指针指向下一个学生信息的结构体。当你从文件中读取学生信息并添加到链表中时,你需要追踪链表的开始部分(即头节点 head)。当第一个学生信息被读取并添加到链表时,头节点就指向这个学生信息,然后随着更多的学生信息被读取并添加到链表,这些新的学生信息会被添加到当前链表的末尾。

    在你的代码中,head->next = stl; 这一行的作用是将刚刚读取的学生信息(stl)添加到链表的开头。这样做的原因是为了在处理删除操作时,可以从链表的开始处遍历整个链表。如果没有这一行,你可能需要额外的逻辑来找到链表的开始部分。而有了这一行,你总是可以从头节点 head 开始遍历整个链表。这是一个优化操作,使得代码更简洁、高效。

    此外,代码中存在一些需要注意的地方:

    1. 你在打开文件后没有检查文件是否正确打开。最好总是检查文件是否成功打开,避免后续操作出现问题。
    2. 在分配内存给 stl 后,你应该确保在使用它之前已经正确初始化了它的内容。虽然你在读取文件时填充了它的内容,但如果文件读取失败或者没有达到预期的长度,可能会导致未定义的行为。
    3. 在删除节点时,你需要处理链表中的节点重新链接的问题。在你的代码中,你只是简单地继续遍历链表并写入新文件,并没有处理释放已删除节点所占用的内存的问题。为了防止内存泄漏,你应该在删除节点后释放它们的内存。而且需要注意的是,在遍历链表时,你可能需要追踪前一个节点以便正确地断开连接。

    希望这些解释和建议对你有所帮助!如果你还有其他问题或需要进一步的解释,请告诉我!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月10日
  • 创建了问题 11月3日