【C语言项目】 以链表实现的管理系统(注册、登录、对表进行数据操作)

第一次编辑这么长的文章,如果对你有帮助,可以点赞收藏一下一起学习!一起进步!


目录

一、项目介绍

二、代码介绍

三、小记

四、完整代码

五、输出结果展示

1、成功将终端输入的用户姓名和密码分别存入到.txt文件中

2、登陆成功     &&    退出成功

3、创建/初始化管理表成功

4、录入人员信息成功

5、按位置插入人员信息成功,插入位置不对会报错

6、输出所有人员信息成功

7、通过姓名查找人员信息成功

8、通过姓名删除人员信息成功

9、导出所有人员信息到文件内成功

10、打印文件信息到终端上成功

11、按姓名将通讯录排序成功(实现的是升序排序)

12、获取链表长度成功

13、统计性别数量成功

14、返回上级菜单成功

15、销毁链表成功

16、退出成功


一、项目介绍

        项目:基于链表的通信录管理

意义:对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度

模块:
一级菜单内容
1> 注册模块:完成用户信息的注册用于登录管理系统,将注册信息存入文件
2> 登录模块:使用输入的登录账号和密码与文件存储信息对比
3> 退出系统


二级菜单内容:
3> 创建模块create:创建链表完成对通信录的存储
4> 添加数据add:添加通信录的信息放入链表中
5> 查找信息find:可以通过姓名进行查找
6> 修改信息update:可以修改联系人信息并保存,修改联系人信息有包括了对联系人编号,姓名,性别,电话号码的分别修改,也可以同时对编号,姓名,性别,电话号码修改;
7> 删除信息delete:可根据输入的姓名进行删除
8> 插入信息insert:将给定的信息以及插入位置信息完成插入
9> 展示信息show:将通讯录的所有信息进行展示
10> 导出信息export:将通讯录信息导出到文件中
11> 按照姓名将通讯录排序
12> 返回上一级
辅助功能:
13> 初始化链表init:将链表进行初始化
14> 获取链表长度getLength:
15> 统计性别;


二、代码介绍

  1. 采用分文件编译,link_list.h,link_list.c,main.c
  2. 在堆区申请了空间用于存放链表
  3. link_list.h中定义了两个结构体,一个是管理结构体,一个是人员信息结构体,同时包含了函数的声明
  4. link_list.c中完成了函数功能的封装
  5. mian.c主函数里,使用了两个while循环,进行菜单的循环展示,如果登录成功,则会进入下一级菜单,使用switch,进行功能的实现
  6. 在注册的时候,只保证了一个用户的创建,多个用户的创建还没实现

三、小记

        项目不难,有耐心就能完成,其中也是遇到了很多的问题。例如在对链表进行操作的时候,没有对输入的内容进行逻辑判断是否合理,导致指针指向的位置发生偏移出现段错误。在进行赋值语句的时候,尝尝忘记数组不能作为常量直接进行赋值,如果需要赋值,需要借助strcmp等函数进行操作,否则会发生报错。


四、完整代码

//link_list.h
#ifndef LINK_LIST_H
#define LINK_LIST_H
#include <myhead.h>

#define MAX 100

//人员信息
typedef struct Person
{
    char id[20];
    char name[20];
    char gender[20];
    char telephone[20];
}Person,*PersonPtr;

//人e员管理
typedef struct Manage
{
    Person person;
    int len;
    struct Manage *next;
}Manage,*ManagePtr;


//创建登录视图
void create_log_view();

//注册
int register_user();

//登录
int log_user();

//判空
int link_empty(ManagePtr person_ptr);

//创建管理视图
void create_view();

//创建班级链表
ManagePtr link_person_create();

//申请人员信息结点
ManagePtr link_apply_node(Person person);

//头删
int link_delete_head(ManagePtr person_ptr);

//头插插入人员信息
int link_insert_person(ManagePtr person_ptr,Person person);

//遍历人员信息
int link_printf_person(ManagePtr person_ptr);

//按位置查找人员结点
ManagePtr link_search_person_pos(ManagePtr person_ptr,int pos);

//按位置插入人员信息
int link_insert_person_pos(ManagePtr person_ptr,int pos,Person person);

//通过姓名查找人员信息
int link_search_name(ManagePtr person_ptr);

//通过人名删除信息
int link_delete_name(ManagePtr person_ptr);

//导出所有人员信息到文件内
void link_export_person(ManagePtr person_ptr);

//打印文件信息
void file_show();

//按照姓名将通讯录排序
void link_person_sort_name(ManagePtr person_ptr);

//统计人员总人数(链表长度)
int link_len(ManagePtr person_ptr);

//统计性别
void link_gender_statistics(ManagePtr person_ptr);

//销毁管理表
void link_destroy(ManagePtr person_ptr);

#endif
//link_list.c
#include "link_list.h"

// 创建登录视图
void create_log_view()
{
    printf("\t\t======1.注册\n");
    printf("\t\t======2.登录\n");
    printf("\t\t======3.退出\n");
}

// 注册
int register_user()
{
    // 存用户和密码
    char user_name[30] = {0};
    char password[30] = {0};

    // 判断是否成功打开文件
    FILE *fp_user = NULL, *fp_password = NULL;
    if ((fp_user = fopen("./user.txt", "w+")) == NULL || (fp_password = fopen("./password.txt", "w+")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    // 从终端输入用户姓名和密码
    printf("请输入用户姓名:");
    fgets(user_name, sizeof(user_name), stdin);

    printf("请输入密码:");
    fgets(password, sizeof(password), stdin);

    // 使用fputs将用户名存入user_name.txt
    fputs(user_name, fp_user);
    user_name[strlen(user_name) - 1] = '\0'; // 将回车换成 '\0'

    // 使用fputs将密码写入password.txt
    fputs(password, fp_password);
    password[strlen(user_name) - 1] = '\0';

    // 关闭文件
    fclose(fp_user);
    fclose(fp_password);

    printf("注册成功\n");
    return 0;
}

// 登录
int log_user()
{
    char buf_name[30] = {0};
    char buf_password[30] = {0};
    char input_name[30] = {0};
    char input_password[30] = {0};

    // 打开文件
    FILE *fp_user = NULL, *fp_password = NULL;
    if ((fp_user = fopen("./user.txt", "r")) == NULL || (fp_password = fopen("./password.txt", "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    // 从文件里获取账号和密码
    while (1)
    {
        // 如果是NULL,用户姓名读取结束
        if ((fgets(buf_name, sizeof(buf_name), fp_user)) == NULL)
        {
            break;
        }

        // 如果是NULL,密码读取结束
        if ((fgets(buf_password, sizeof(buf_password), fp_password)) == NULL)
        {
            break;
        }
    }
    buf_name[strlen(buf_name) - 1] = '\0'; // 将回车换成 '\0
    buf_password[strlen(buf_password) - 1] = '\0';

    // 输入用户名和密码
    printf("请输入用户名:");
    scanf("%s", input_name);
    getchar();

    printf("请输入密码:");
    scanf("%s", input_password);
    getchar();

    // 判断是否相等
    if (strcmp(buf_name, input_name) == 0 && strcmp(buf_password, input_password) == 0)
    {
        printf("登录成功\n");
        return 0;
    }
    printf("用户名或密码错误,请重新输入\n");
    return -1;
}

// 判空
int link_empty(ManagePtr person_ptr)
{
    return person_ptr->next == NULL; // 如果头指针为空,则表示该链表为空,返回1;
}

// 创建管理视图
void create_view()
{
    printf("\t\t======1.创建/初始化管理表\n");
    printf("\t\t======2.录入人员信息\n");
    printf("\t\t======3.按位置插入人员信息\n");
    printf("\t\t======4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值