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

相关推荐
charlie1145141912 小时前
现代C++工程实践:简单的IniParser3——改进我们的split
开发语言·c++·笔记·学习
fish_xk2 小时前
c++的引用和类的初见
开发语言·c++
独行soc2 小时前
2025年渗透测试面试题总结-280(题目+回答)
网络·python·安全·web安全·网络安全·渗透测试·安全狮
yong99902 小时前
水箱水位控制系统MATLAB实现
开发语言·matlab
通往曙光的路上2 小时前
授权vvvvvv
java·开发语言·windows
Data_agent2 小时前
京东商品视频API,Python请求示例
java·开发语言·爬虫·python
a努力。2 小时前
HSBC Java面试被问:CAS如何解决ABA问题
java·开发语言·面试
唯创知音3 小时前
WT2605A录音方案实现高保真音频采集本地存储云端同步!
网络·音视频·录音芯片·录音方案·录音上传
lang201509283 小时前
深入解析Java资源加载机制
java·开发语言·python