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语言中级练习的典型范例。实际开发时可进一步扩展搜索功能、界面交互等模块。

相关推荐
Interview Aid1121 分钟前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
CoderIsArt7 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
IT大白鼠9 小时前
MSF二次开发与自定义模块编写
网络·安全·web安全·msf
Julien200410 小时前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
AI情绪识别开源10 小时前
检信 ALLEMOTION OS 加密打包可执行程序 — 全面测试报告版本: v1.3功能测试 / 性能测试 /
开发语言·数据结构·人工智能·功能测试
「QT(C++)开发工程师」11 小时前
C++ auto 用法详解
开发语言·c++
OPEN-F11 小时前
C++STL教程:容器适配器与实用工具
开发语言·c++
kekekzt11 小时前
TCP协议的粘包问题介绍,IP分片,MTU,MSS,滑动窗口的概念及之间的关系
网络·网络协议·tcp/ip
yaoxin52112311 小时前
507. Java 反射 - 在 BeanFactory 中实现依赖注入
java·开发语言