第一次编辑这么长的文章,如果对你有帮助,可以点赞收藏一下一起学习!一起进步!
目录
一、项目介绍
项目:基于链表的通信录管理
意义:对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度
模块:
一级菜单内容
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> 统计性别;
二、代码介绍
- 采用分文件编译,link_list.h,link_list.c,main.c
- 在堆区申请了空间用于存放链表
- link_list.h中定义了两个结构体,一个是管理结构体,一个是人员信息结构体,同时包含了函数的声明
- link_list.c中完成了函数功能的封装
- mian.c主函数里,使用了两个while循环,进行菜单的循环展示,如果登录成功,则会进入下一级菜单,使用switch,进行功能的实现
- 在注册的时候,只保证了一个用户的创建,多个用户的创建还没实现
三、小记
项目不难,有耐心就能完成,其中也是遇到了很多的问题。例如在对链表进行操作的时候,没有对输入的内容进行逻辑判断是否合理,导致指针指向的位置发生偏移出现段错误。在进行赋值语句的时候,尝尝忘记数组不能作为常量直接进行赋值,如果需要赋值,需要借助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

最低0.47元/天 解锁文章
8万+

被折叠的 条评论
为什么被折叠?



