C语言实战2

C语言实战案例:文件操作与数据结构

案例目标:

实现一个学生信息管理系统,包含文件读写、链表操作和基本增删改查功能。

文件读写与链表结合

定义学生结构体并创建链表:

复制代码
typedef struct Student {
    int id;
    char name[50];
    float score;
    struct Student *next;
} Student;

文件写入函数示例:

复制代码
void saveToFile(Student *head, const char *filename) {
    FILE *file = fopen(filename, "w");
    if (!file) return;
    
    Student *current = head;
    while (current != NULL) {
        fprintf(file, "%d %s %.2f\n", current->id, current->name, current->score);
        current = current->next;
    }
    fclose(file);
}

动态内存管理

从文件加载数据到链表:

复制代码
Student* loadFromFile(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (!file) return NULL;

    Student *head = NULL, *tail = NULL;
    while (!feof(file)) {
        Student *newNode = (Student*)malloc(sizeof(Student));
        if (fscanf(file, "%d %s %f", &newNode->id, newNode->name, &newNode->score) == 3) {
            newNode->next = NULL;
            if (!head) head = newNode;
            else tail->next = newNode;
            tail = newNode;
        } else {
            free(newNode);
            break;
        }
    }
    fclose(file);
    return head;
}

实用功能实现

链表插入与删除操作:

复制代码
void insertStudent(Student **head, int id, const char *name, float score) {
    Student *newNode = (Student*)malloc(sizeof(Student));
    newNode->id = id;
    strcpy(newNode->name, name);
    newNode->score = score;
    newNode->next = *head;
    *head = newNode;
}

void deleteStudent(Student **head, int id) {
    Student *temp = *head, *prev = NULL;
    while (temp != NULL && temp->id != id) {
        prev = temp;
        temp = temp->next;
    }
    if (temp == NULL) return;
    if (prev == NULL) *head = temp->next;
    else prev->next = temp->next;
    free(temp);
}

高级应用示例

排序功能实现(冒泡排序):

复制代码
void sortByScore(Student **head) {
    if (!*head || !(*head)->next) return;
    
    int swapped;
    Student *ptr1;
    Student *lptr = NULL;
    
    do {
        swapped = 0;
        ptr1 = *head;
        while (ptr1->next != lptr) {
            if (ptr1->score < ptr1->next->score) {
                // 交换数据域
                Student temp = *ptr1;
                ptr1->id = ptr1->next->id;
                strcpy(ptr1->name, ptr1->next->name);
                ptr1->score = ptr1->next->score;
                
                ptr1->next->id = temp.id;
                strcpy(ptr1->next->name, temp.name);
                ptr1->next->score = temp.score;
                
                swapped = 1;
            }
            ptr1 = ptr1->next;
        }
        lptr = ptr1;
    } while (swapped);
}

错误处理增强

增加文件操作安全检查:

复制代码
Student* safeLoad(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (!file) {
        perror("Error opening file");
        return NULL;
    }

    // ...(其余加载逻辑)
    
    if (ferror(file)) {
        perror("Error reading file");
        clearerr(file);
        fclose(file);
        return NULL;
    }
    fclose(file);
    return head;
}

该案例完整实现了文件持久化存储、动态内存管理、链表操作等核心功能,可作为C语言中级练习的典型范例。实际开发时可进一步扩展搜索功能、界面交互等模块。

相关推荐
Highcharts.js1 小时前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
测试员周周5 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
小辰记事本7 小时前
从零读懂RoCEv2数据包构造:从WQE到线缆上的完整旅程
服务器·网络·网络协议·rdma
杜子不疼.8 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号38 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
北京耐用通信9 小时前
全域适配工业场景耐达讯自动化Modbus TCP 转 PROFIBUS 网关轻松实现以太网与现场总线互通
网络·人工智能·网络协议·自动化·信息与通信
sycmancia9 小时前
Qt——编辑交互功能的实现
开发语言·qt
在角落发呆9 小时前
Linux转发配置:解锁网络互联的核心密码
linux·运维·网络
石山代码9 小时前
C++ 内存分区 堆区
java·开发语言·c++
无风听海9 小时前
C# 隐式转换深度解析
java·开发语言·c#