意义:对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度
模块:
一级菜单内容
1> 注册模块:完成用户信息的注册用于登录管理系统,将注册信息存入文件
2> 登录模块:使用输入的登录账号和密码与文件存储信息对比
3> 退出系统
二级菜单内容:
3> 创建模块create:创建链表完成对通信录的存储
4> 添加数据add:添加通信录的信息放入链表中
5> 查找信息find:可以通过姓名进行查找
6> 修改信息update:可以修改联系人信息并保存,修改联系人信息有包括了对联系人编号,姓名,性别,电话号码的分别修改,也可以同时对编号,姓名,性别,电话号码修改;
7> 删除信息delete:可根据输入的姓名进行删除
8> 插入信息insert:将给定的信息以及插入位置信息完成插入
9> 展示信息show:将通讯录的所有信息进行展示
10> 导出信息export:将通讯录信息导出到文件中
11> 按照姓名将通讯录排序
12> 返回上一级
test.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"test.h"
int menu1; //功能菜单选项
char userName[20];
char pwd[20];
//主界面菜单
void interface(){
while(1)
{
printf("\t\t=====员工登录系统=======\n");
printf("\t\t1、注册信息\n");
printf("\t\t2、用户登录\n");
printf("\t\t0、退出\n");
printf("\t\t*************************\n");
printf("请输入功能选项:");
scanf("%d", &menu1);
switch(menu1)
{
case 1:{
regist();
}
break;
case 2:
{
sign();
}break;
case 0:
break;
return ;
}
}
}
//注册信息函数
void regist(){
for(;;)
{
printf("请输入注册账号:");
scanf("%s", userName);
printf("请输入注册密码:");
scanf("%s", pwd);
if(strlen(pwd)<6)
{
printf("您输入的密码不合法,请重新输入\n");
}else
{
printf("注册成功\n");
break;
}
}
//将新用户的账号和密码保存到文件中区
FILE *fp = fopen(".//account.txt", "a+");
if(NULL==fp)
{
printf("文件打开失败\n");
return ;
}
//将信息报错到文件中
fprintf(fp, "%s %s\n", userName, pwd);
//关闭文件
fclose(fp);
}
//自定义函数
void sign(){
char name[20];
char password[20];
printf("请输入登录账号:");
scanf("%s", name);
printf("请输入密码:");
scanf("%s", password);
//获取数据库中的账号和密码
FILE *fp = fopen(".//account.txt", "r");
if(NULL == fp)
{
printf("文件打开失败\n");
return ;
}
while(!feof(fp))
{
//读取信息
fscanf(fp, "%s%s", userName, pwd);
if(strcmp(userName,name)==0 && strcmp(pwd,password)==0)
{
printf("登录成功\n");
printf("请选择以下功能\n");
Linklist L=list_create();
Linklist apply_node();
while(1)
{
face2();
int flag=0;
switch(menu1){
case 1:{
list_inset_add(L);
}break;
case 2:{
scanf("%s",name);
list_find(L,name);
}break;
case 3:{
scanf("%s",name);
list_update(L,name);
}break;
case 4:{
scanf("%s",name);
list_delete_pos(L,name);
}break;
case 5:{
insert_pos(L);
}break;
case 6:{
list_show(L);
}break;
case 7:
{
list_derive(L);
}break;
case 8:{
list_sort_name(L);
}break;
case 9:{
flag=1;
}break;
}
if(flag==1){
break;
}
}
}
}
printf("登录失败\n");
fclose(fp);
}
//二级菜单
void face2(){
printf("\t\t***************************\n");
printf("\t\t1、****添加数据****\n");
printf("\t\t2、****查找信息****\n");
printf("\t\t3、****修改信息****\n");
printf("\t\t4、****删除信息****\n");
printf("\t\t5、****插入信息****\n");
printf("\t\t6、****展示信息****\n");
printf("\t\t7、****导出信息****\n");
printf("\t\t8、****按照姓名排序\n");
printf("\t\t9、****返回上一级****\n");
printf("\t\t*************************\n");
printf("请输入功能选项:");
scanf("%d", &menu1);
}
//创建链表
Linklist list_create(){
//在堆区申请头结点
Linklist L=(Linklist)malloc(sizeof(Node));
if(NULL==L){
printf("创建失败\n");
return NULL;
}
//初始化
L->len=0;
L->next=NULL;
printf("创建成功\n");
return L;
}
//申请结点封装数据
Linklist apply_node(){
//申请结点空间
Linklist p=(Linklist)malloc(sizeof(Node));
if(NULL==p){
printf("结点申请失败\n");
return NULL;
}
p->next=NULL;
return p;
}
//遍历
void list_show(Linklist L){
if(NULL==L){
printf("遍历失败\n");
return ;
}
//定义遍历指针
Linklist q=L->next;
while(q!=NULL){
printf("编号%d\n",q->data.no);
printf("姓名%s\n",q->data.name);
printf("性别%s\n",q->data.sex);
printf("电话%s\n",q->data.tel);
q=q->next;
}
printf("\n");
}
//添加信息
int list_inset_add(Linklist L){
Linklist p=apply_node();
if(NULL==p){
printf("添加失败\n");
return -1;
}
p->next=L->next;
L->next=p;
printf("请输入编号");
scanf("%d",&p->data.no);
printf("请输入姓名");
scanf("%s",p->data.name);
printf("请输入性别");
scanf("%s",p->data.sex);
printf("电话号码:");
scanf("%s",p->data.tel);
printf("%s的信息录入成功",p->data.name);
L->len++;
return 0;
}
//查找
Linklist list_find(Linklist L,datatype name[]){
if(NULL==L){
printf("查找失败\n");
return NULL;
}
Linklist q=L->next;
for(int i=0;i<L->len;i++){
printf("%s",q->data.name);
if(strcmp(q->data.name,name)==0){
printf("请输入要查找的姓名:\n");
printf("%s",q->data.name);
printf("查找成功\n");
return q;
}
q=q->next;
}
return NULL;
}
//修改信息
int list_update(Linklist L,datatype name[]){
if(NULL==L){
printf("修改失败\n");
return -1;
}
Linklist p=list_find(L,name);
printf("请输入要修改的编号");
scanf("%d",&p->data.no);
printf("要修改的联系人的姓名:");
scanf("%s",p->data.name);
printf("要修改的联系人的性别:");
scanf("%s",p->data.sex);
printf("要修改的联系人的电话:");
scanf("%s",p->data.tel);
list_show(L);
printf("修改成功\n");
return 0;
}
//删除信息
int list_delete_pos(Linklist L,datatype name[]){
if(NULL==L){
printf("删除失败\n");
return -1;
}
int i,temp;
Linklist p=L->next;
for(i=0;i<L->len;i++){
if(strcmp(p->data.name,name)==0){
temp=i;
p=p->next;
}
}
Linklist t=L;
for(i=0;i<temp;i++){
t=t->next;
}
Linklist q=t->next;
t->next=q->next;
free(q);
q=NULL;
L->len--;
printf("删除成功\n");
return 0;
}
//插入信息
int insert_pos(Linklist L){
if(NULL==L){
printf("插入失败\n");
return -1;
}
Linklist p=apply_node();
p->next=L->next;
L->next=p;
p=list_inset_add(L);
L->len++;
printf("插入成功\n");
return 0;
}
//导出信息
void list_derive(Linklist L){
if(NULL==L){
printf("遍历失败\n");
return ;
}
//定义遍历指针
Linklist q=L->next;
int i;
for(i=0;i<L->len;i++){
printf("编号%d\n",q->data.no);
printf("姓名%s\n",q->data.name);
printf("性别%s\n",q->data.sex);
printf("电话%s\n",q->data.tel);
//导出信息到文件
FILE *fp = fopen(".//meum.txt", "a+");
if(NULL==fp)
{
printf("文件打开失败\n");
return ;
}
//将信息保存到文件中
fprintf(fp, "%d %s %s %s\n",q->data.no,q->data.name,q->data.sex,q->data.tel);
//关闭文件
fclose(fp);
}
q=q->next;
}
//按照姓名在通讯录排序
void list_sort_name(Linklist L){
if(NULL==L){
printf("排序失败\n");
return ;
}
Linklist p = L->next;
staff temp;
for(int i=1;i<L->len;i++){
Linklist p=L->next;
for(int j=0;j<L->len-i;j++){
if(strcmp(p->data.name,p->next->data.name)>0){
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
p=p->next;
}
}
}
test.h
#ifndef __TEST_H__
#define __TEST_H__
typedef char datatype;
//定义联系人结构体
typedef struct staff{
int no; // 编号
char name[20];//姓名
char sex[66]; //性别
char tel[15]; //电话
}staff;
//定义结点结构体
typedef struct Node{
staff data; //普通数据域
int len; //头结点数据域
struct Node *next; //头结点指针域
}*Linklist,Node;
//注册信息
void regist();
void interface();
int list_update();
//登陆
void sign();
//查找
Linklist list_find(Linklist L,datatype name[]);
//二级目录菜单
void face2();
//修改信息
int list_update(Linklist L,datatype name[]);
//创建链表
Linklist list_create();
//申请结点封装数据
Linklist apply_node();
//遍历
void list_show(Linklist L);
//添加数据
int list_inset_add(Linklist L);
//删除数据
int list_delete_pos(Linklist,datatype name[]);
//插入信息
int insert_pos(Linklist L);
//导出信息
void list_derive(Linklist L);
//排序
void list_sort_name(Linklist L);
#endif
main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"test.h"
int main(int argc, const char *argv[])
{
int menu1; //功能菜单选项
char userName[20];
char pwd[20];
//调用主界面菜单函数
interface();
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/e6213610ba4f967d39f7368bf57c4b53.png)