C语言链表实现职工信息管理系统完整示例

纸上星河
纸上星河
发布时间:2026-10-15 | 2人浏览过
原创

本教程演示如何使用C语言结合单向链表结构构建一个功能完整的职工信息管理系统。该系统实现了数据的动态内存管理、多条件检索、增删改查(CRUD)操作以及磁盘文件的持久化存储与备份。文章包含详细的头文件说明、结构体定义、核心算法逻辑及完整的可运行源代码。

系统设计与准备

该系统的核心数据结构为单向链表(Singly Linked List),每个节点存储一名职工的详细信息。为了便于管理和扩展,系统采用模块化函数设计,将输入、查找、更新、排序和文件I/O分离处理。

第1步:定义数据结构与引入依赖

首先,需要引入标准C库以支持输入输出、字符串处理和动态内存分配。随后定义 STU 结构体作为链表节点,包含姓名、年龄、工龄、性别、婚姻状况、职级及在职状态等字段,并包含指向下一个节点的指针。

主要头文件包括:

  • <stdio.h>:标准输入输出。
  • <malloc.h> 或 <stdlib.h>:用于 malloc 动态分配节点内存。
  • <string.h>:用于 strcmp 等字符串比较操作。
  • <conio.h>:提供 getch() 用于控制台无回显输入(Windows环境常用)。
  • <memory.h> 或 <string.h>:提供 memcpy 用于结构体内存拷贝,在排序交换时使用。
typedef struct node {
    char name[20];
    int age;
    int worktime;
    char sex[20];
    char marrige[20];
    int grade;
    char tired[20]; // 是否在职
    struct node *next;
} STU;

核心功能实现

第2步:主程序流程与安全机制

程序启动后,首先执行简单的口令验证机制,限制非法用户访问。验证通过后,进入主循环菜单,提供一系列功能选项。使用 system("cls") 清屏以保持界面整洁。

主菜单功能映射如下:

  1. 录入信息:批量创建新节点并链接到链表头部或尾部。
  2. 显示全部:遍历链表并格式化打印所有节点数据。
  3. 查询信息:支持按姓名、工龄或级别进行线性搜索。
  4. 新增信息:插入新节点,并根据姓名字典序或特定规则调整链表顺序。
  5. 删除信息:根据姓名定位节点,调整前后节点指针以移除目标。
  6. 修改信息:定位节点后覆盖原有字段数据。
  7. 信息排序:按职级(grade)进行非递减排序。
  8. 文件操作:实现数据的磁盘序列化(保存)、反序列化(加载)及二进制/文本备份。

第3步:数据的动态管理与操作

创建与插入: 使用 malloc(sizeof(STU)) 申请内存。若链表为空,新节点即为头节点;否则,将其追加至尾节点 pend->next。

查找逻辑: 系统提供了专用的查找函数如 findByName、findByWorktime 和 findByGrade。这些函数返回指向匹配节点的指针,若未找到则返回 NULL。为了支持删除操作,还设计了 findByNumEx,同时返回当前节点及其前驱节点指针,以便正确断开链表连接。

删除逻辑: 当确定要删除的节点 presult 和前驱节点 pbefore 后:

  • 若 presult 是头节点(head == presult),则将头指针移至 presult->next。
  • 否则,令 pbefore->next = presult->next,跳过中间节点,完成物理删除。

排序逻辑: 采用选择排序算法思想。外层循环遍历链表,内层寻找剩余部分中职级最低的节点 pindex。找到后,使用 memcpy 对两个节点的内容进行原地交换(注意需排除 next 指针的长度),从而保持链表结构的稳定性。

void sort(STU *head) {
    STU *pi, *pj, *pindex, temp;
    int len = sizeof(STU) - sizeof(STU*); // 排除指针成员长度
    int i, j, n = 0;
    for(p=head; p!=NULL; p=p->next) n++;
    
    for(pi=head, i=0; i<n-1; i++, pi=pi->next){
        pindex = pi;
        for(pj=pi->next, j=i+1; j<n; j++, pj=pj->next)
            if(pindex->grade > pj->grade)
                pindex = pj;
        
        if(pindex != pi){
            memcpy(&temp, pi, len);
            memcpy(pi, pindex, len);
            memcpy(pindex, &temp, len);
        }
    }
}

数据持久化与备份

第4步:文件的保存与加载

系统支持将内存中的链表数据写入文本文件,以及从文件中读取恢复数据,防止意外丢失。

保存 (Save): 打开指定文件(模式为写 "w"),使用 fprintf 依次写入表头和各节点的字段数据。写入完成后,追加一个结束标记(如 0),以便加载时识别终点。

加载 (Load): 打开文件(模式为读 "r"),跳过之前的表头描述行(通过固定次数 fscanf 消耗字符)。然后循环读取节点数据,每读取一个非标记值就创建一个新节点并加入链表,直到遇到结束标记 "0" 停止。

备份 (Copy): 使用 fgetc 和 fputc 逐字节复制文件,实现简单的文件镜像备份,适用于不解析内容的纯数据保护。

运行效果与注意事项

编译并运行程序后,用户需先输入正确密码(示例代码中预设口令较为简单,实际应用中应加密存储)方可进入主界面。各项操作通过数字菜单触发,操作完成后按下任意键继续或返回主菜单。

以上代码展示了C语言在处理基础数据结构和管理类应用时的典型实践。对于生产环境,建议改进输入验证(避免缓冲区溢出)、优化排序算法(如改用指针重组而非内容交换)以及增加错误处理机制。以上就是C语言实现简单职工信息管理系统的详细内容,更多关于C语言链表应用与数据结构优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表