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

相关推荐
wuyk5553 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
hey_sml3 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
萧瑟余晖4 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
ttod_qzstudio5 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
2401_865382506 小时前
密评与等保的关系:不是替代,而是互补
网络·信息化造价
萧瑟余晖6 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
白狐_7988 小时前
408计算机网络第3章:PPP协议——帧格式、LCP/NCP、状态机与真题精讲
网络·计算机网络·智能路由器
MIXLLRED8 小时前
解决——Ubuntu远程桌面指令更换网络
linux·网络·ubuntu
C++ 老炮儿的技术栈8 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
二十雨辰9 小时前
[Java]-Spring面试题
java·开发语言