1.07 标准IO

1.思维导图

2.先编写以下结构体

struct Student

{
char name[20];
double math;
double chinese;
double english;
double physical;
double chemical;
double biological; };

第一步:创建一个 struct Student 类型的链表L,初始化该链表中3个学生的属性

第二步:编写一个叫做save的函数,功能为 将链表L中的3个学生的所有信息,保存到文件中去,使用fprintf实现
第三步:编写一个叫做load的函数,功能为 将文件中保存的3个学生信息,读取后,写入到另一个链表L1中去
第四步:编写一个叫做 show的函数,功能为 遍历输出 L或者 L1链表中的所有学生的信息
第五步:编写一个叫做 setMath 的函数,功能为 修改 文件中 所有学生的数学成绩

1>程序代码:
cs 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//定义一个学生成绩的结构体类型
typedef struct Student
{
    char name[20];
    double math;
    double chinese;
    double english;
    double physical;
    double chemical;
    double biological;
    struct Student *next;
} Stu, *StuPtr;

//创建链表
StuPtr create()
{
    StuPtr L = NULL;
    return L;
}

//添加数据
StuPtr add(StuPtr L)
{
    StuPtr s = (StuPtr)malloc(sizeof(Stu));
    if (s == NULL)
    {
        printf("内存分配失败!\n");
        return L;
    }

    if (L == NULL)
    {
        L = s;
        s->next = NULL;
    }
    else
    {
        StuPtr p = L;
        while (p->next!= NULL)
        {
            p = p->next;
        }
        p->next = s;
    }
    s->next = NULL;

    printf("姓名:");
    scanf("%s", s->name);
    printf("数学:");
    scanf("%lf", &s->math);
    printf("语文:");
    scanf("%lf", &s->chinese);
    printf("英语:");
    scanf("%lf", &s->english);
    printf("物理:");
    scanf("%lf", &s->physical);
    printf("化学:");
    scanf("%lf", &s->chemical);
    printf("生物:");
    scanf("%lf", &s->biological);
    printf("\n");

    return L;
}

//将数组链表L中学生信息保存到文件中
void save(StuPtr L, const char *filename)
{
    if (L == NULL)
    {
        printf("保存失败!\n");
        return;
    }

    FILE *fp = fopen(filename, "w");
    if (fp == NULL)
    {
        printf("无法打开文件!\n");
        return;
    }

    StuPtr p = L;
    while (p!= NULL)
    {
        fprintf(fp, "%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", p->name, p->math, p->chinese, p->english, p->physical, p->chemical, p->biological);
        p = p->next;
    }

    fclose(fp);
}

//将文件中保存的学生信息,写入到另一个链表L1中
void load(StuPtr *L1, const char *filename)
{
    FILE *fp = fopen(filename, "r");
    if (fp == NULL)
    {
        printf("无法打开文件!\n");
        return;
    }

    *L1 = NULL;
    while (1)
    {
        StuPtr s = (StuPtr)malloc(sizeof(Stu));
        if (s == NULL)
        {
            printf("内存分配失败!\n");
            break;
        }

        int res = fscanf(fp, "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n", s->name, &s->math, &s->chinese, &s->english, &s->physical, &s->chemical, &s->biological);
        if (res == EOF)
        {
            free(s);
            break;
        }

        s->next = *L1;
        *L1 = s;
    }

    fclose(fp);
}

//展示链表内容
void show(StuPtr L)
{
    StuPtr p = L;
    if (p == NULL)
    {
        printf("展示失败!\n");
        return;
    }

    printf("姓名\t数学\t语文\t英语\t物理\t化学\t生物\n");
    while (p!= NULL)
    {
        printf("%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", p->name, p->math, p->chinese, p->english, p->physical, p->chemical, p->biological);
        p = p->next;
    }
    printf("------------------------------------------------------\n");
}

//修改文件中所有学生的数学成绩
void setMath(const char *filename, double math)
{
    StuPtr L = create();
    load(&L, filename); // 修正这里,传递指针的指针
    StuPtr p = L;
    while (p!= NULL)
    {
        p->math = math;
        p = p->next;
    }
    save(L, filename);

    // 释放内存
    while (L!= NULL)
    {
        StuPtr temp = L;
        L = L->next;
        free(temp);
    }
}

int main(int argc, const char *argv[])
{
    StuPtr L = create();
    L = add(L);
    L = add(L);
    L = add(L);

    save(L, "student.txt");

    StuPtr L1 = create();
    load(&L1, "student.txt"); // 修正这里,传递指针的指针

    show(L);
    show(L1);

    setMath("student.txt", 100);

    // 释放内存
    while (L!= NULL)
    {
        StuPtr temp = L;
        L = L->next;
        free(temp);
    }
    while (L1!= NULL)
    {
        StuPtr temp = L1;
        L1 = L1->next;
        free(temp);
    }

    return 0;
}
2>运行结果显示:
相关推荐
学不动CV了15 分钟前
数据结构---链表结构体、指针深入理解(三)
c语言·arm开发·数据结构·stm32·单片机·链表
weixin_446122461 小时前
LinkedList剖析
算法
百年孤独_2 小时前
LeetCode 算法题解:链表与二叉树相关问题 打打卡
算法·leetcode·链表
我爱C编程2 小时前
基于拓扑结构检测的LDPC稀疏校验矩阵高阶环检测算法matlab仿真
算法·matlab·矩阵·ldpc·环检测
算法_小学生2 小时前
LeetCode 75. 颜色分类(荷兰国旗问题)
算法·leetcode·职场和发展
运器1232 小时前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
算法_小学生2 小时前
LeetCode 287. 寻找重复数(不修改数组 + O(1) 空间)
数据结构·算法·leetcode
岁忧2 小时前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
alphaTao2 小时前
LeetCode 每日一题 2025/6/30-2025/7/6
算法·leetcode·职场和发展
ゞ 正在缓冲99%…2 小时前
leetcode67.二进制求和
算法·leetcode·位运算