意义:对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度
模块:
一级菜单内容
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> 统计性别;
实现的功能效果:
注册和登录:
添加信息:
展示功能:
查找功能:
修改信息:
导出信息:
排序功能:
进入辅助功能:
输出链表长度:
统计男女个数:
初始化链表:
代码:
project.h:
int con_update_name(contacts l,datatype* n,datatype* new_n,char* x,int b,datatype* h);
//按值删除信息(通过姓名删除信息)
int con_delete_value(contacts l,datatype* n);
//按位置插入信息
int con_insert_pos(contacts l,int pos,contacts e);
//展示信息
void con_show(contacts l);
//导出信息
void con_put(contacts l);
//排序
void con_sort(contacts l);
//初始化链表
void con_end(contacts l);
//获取链表长度
int con_len(contacts l);
//统计性别(男有几个女有几个)
void con_count(contacts l);
//头删
int con_delete(contacts l);
project.c:
#include"project.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//创建链表
contacts con_create()
{
//给链表申请空间
contacts l=(contacts)malloc(sizeof(node));
if(NULL==l)
{
printf("申请失败\n");
return NULL;
}
//申请成功则初始化
l->name[20]=0;
l->sex[10]=0;
l->num=0;
l->phone[20]=0; //数据域初始化
l->len=0; //长度初始化
l->next=NULL; //指针域初始化
printf("链表预创建创建成功\n");
return l;
}
//申请结点封装数据
contacts con_apply(datatype* n,char* x,int b,datatype *h)
{
contacts p=(contacts)malloc(sizeof(node));
if(NULL==p)
{
printf("申请结点失败\n");
return NULL;
}
//将数据封装到结点中
strcpy(p->name,n); //将姓名封装到数据域中
strcpy(p->sex,x); //将性别封装到数据域中
p->num=b; //将编号封装到数据域中
strcpy(p->phone,h); //将号码封装到数据域中
p->next=NULL; //指针指向空
return p;
}
//判空(辅助函数不记录在功能表中)
int con_empty(contacts l)
{
return l->next==NULL; //判断头结点的指针域是否指向空 空为1 非空为0
}
//添加信息(头插)
int con_insert(contacts l,datatype* n,char* x,int b,datatype* h)
{
//判断逻辑
if(NULL==l)
{
printf("所给链表不合法");
return -1;
}
//申请结点封装数据
contacts p=con_apply(n,x,b,h);
//头插逻辑
p->next=l->next;
l->next=p;
printf("添加信息成功\n");
//长度变化
l->len++;
return 0;
}
//通过值(姓名)返回元素下标(辅助功能函数不记录在功能表中)
int con_search_value(contacts l,datatype* n)
{
//判断逻辑
if(NULL==l||con_empty(l))
{
printf("链表不合法或者为空无法查找\n");
return -1;
}
//返回下标逻辑
int pos=1;
contacts q=l->next; //定义一个遍历指针从头结点出发
int flag=0;
while(q!=NULL&&strcmp(n,q->name)!=0)
{
q=q->next;
pos++;
}
if(pos>l->len)
{
printf("该员工不在系统中\n");
return -1;
}
return pos;
}
//按值查找信息(通过姓名进行查找)
int con_search_name(contacts l,datatype* n)
{
//判断逻辑
if(NULL==l||con_empty(l))
{
printf("所给链表为空或者不合法查找失败\n");
return -1;
}
//查找信息返回元素下标
int pos=con_search_value(l,n);
//定义一个遍历指针
contacts p=l->next; //定义一个遍历指针从第一个元素出发
//将指针移动到返回的元素下标位置上
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
char x[10];
strcpy(x,p->sex);
int b;
b=p->num;
datatype h[20];
strcpy(h,p->phone);
printf("已查到员工信息->性别:%s 员工编号:%d 员工电话号码:%s",x,b,h);
printf("\n");
return 0;
}
//按值修改信息(通过姓名)
int con_update_name(contacts l,datatype* n,datatype* new_n,char* x,int b,datatype* h)
{
//判断逻辑
if(NULL==l||con_empty(l))
{
printf("所给链表为空或者不合法查找失败\n");
return -1;
}
//查找逻辑
int pos=con_search_value(l,n);
//修改逻辑
//将指针移动到对应元素下标上
contacts p=l->next; //定义一个遍历结点从第一个结点出发
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
strcpy(p->name,new_n);
strcpy(p->sex,x);
p->num=b;
strcpy(p->phone,h);
printf("员工信息已经修改完成\n");
return 0;
}
//按照值删除信息(通过姓名删除信息)
int con_delete_value(contacts l,datatype* n)
{
//判断逻辑
if(NULL==l||con_empty(l))
{
printf("链表为空或者不合法无法进行删除操作\n");
return -1;
}
//找到结点返回下标
int pos=con_search_value(l,n);
//定义一个结点从第一个结点出发找到要删除的前一个结点
contacts q=l->next;
for(int i=0;i<pos-2;i++)
{
q=q->next;
}
//定义删除节点三原则删除
contacts p=q->next; //标记
q->next=p->next; //孤立
//删除
free(p);
p=NULL;
//长度变化
l->len--;
return 0;
}
//按照位置插入信息
int con_insert_pos(contacts l,int pos,contacts e)
{
//判断逻辑
if(NULL==l||con_empty(l))
{
printf("所给链表不合法或者为空无法插入\n");
return -1;
}
//定位逻辑
//定义一个遍历结点从第一个结点出发找到pos前一个位置
contacts q=l->next;
for(int i=0;i<pos-2;i++)
{
q=q->next;
}
//插入逻辑
e->next=q->next;
q->next=e;
//长度变化
l->len++;
printf("插入成功\n");
return 0;
}
//展示信息函数定义
void con_show(contacts l)
{
//判断逻辑
if(NULL==l||con_empty(l))
{
printf("所给链表不合法或者为空遍历无效\n");
return ;
}
//定义一个遍历指针从第一个结点出发
contacts p=l->next;
//循环遍历逻辑
while(p!=NULL)
{
printf("%s\t %s\t %d\t %s\t",p->name,p->sex,p->num,p->phone);
printf("\n");
p=p->next;
}
}
//导出信息函数
void con_put(contacts l)
{
//判断逻辑
if(NULL==l||con_empty(l))
{
printf("所给链表不合法或者为空无法导出\n");
return ;
}
//导出逻辑
//定义一个遍历指针从第一个结点出发
contacts p=l->next;
//定义一个流指针打开文件
FILE *FP=fopen("./projectnews.txt","a+");
if(NULL==FP)
{
printf("文件打开失败\n");
return ;
}
//对文件进行操作
while(p!=NULL)
{
fprintf(FP,"%s %s %d %s\n",p->name,p->sex,p->num,p->phone);
p=p->next;
}
printf("导出成功\n");
//关闭文件
fclose(FP);
}
//排序
void con_sort(contacts l)
{
//判断逻辑
if(NULL==l||con_empty(l))
{
printf("链表不合法或者为空无法排序\n");
return ;
}
//按名字排序逻辑
//定义一个遍历指针从第一个结点开始
contacts p;
//定义第二个指针从指针p后面开始
contacts q;
//定义一个指针记录最小结点
contacts min;
for(p=l->next;p!=NULL;p=p->next)
{
min=p; //将待排序的一个结点定义为最小结点
for(q=p->next;q!=NULL;q=q->next)
{
if(strcmp(min->name,q->name)<0)
{
min=q;
}
}
if(min!=p)
{
//交换姓名
datatype temp_name[20];
strcpy(temp_name,p->name);
strcpy(p->name,min->name);
strcpy(min->name,temp_name);
//交换性别
char temp_sex[10];
strcpy(temp_sex,p->sex);
strcpy(p->sex,min->sex);
strcpy(min->sex,temp_sex);
//交换编号
int temp_num=p->num;
p->num=min->num;
min->num=temp_num;
//交换号码
datatype temp_phone[20];
strcpy(temp_phone,p->phone);
strcpy(p->phone,min->phone);
strcpy(min->phone,temp_phone);
}
}
printf("排序成功\n");
}
//定义头删
int con_delete(contacts l)
{
if(NULL==l||con_empty(l))
{
printf("头删失败\n");
return -1;
}
contacts p=l->next;
l->next=p->next;
free(p);
p=NULL;
l->len--;
return 0;
}
//初始化链表
void con_end(contacts l)
{
//判断逻辑
if(NULL==l||con_empty(l))
{
printf("链表为空或者不合法无需初始化\n");
return ;
}
//初始化循环头删逻辑
while(l->next!=NULL)
{
con_delete(l);
}
//释放头结点
free(l);
l=NULL;
printf("链表初始化成功\n");
}
//获取链表的长度
int con_len(contacts l)
{
int count=0;
if(NULL==l||con_empty(l))
{
return 0;
}
//定义遍历指针指向第一个结点
contacts q=l->next;
while(q!=NULL)
{
count=count+1;
q=q->next;
}
printf("获取链表长度完成\n");
return count;
}
//统计性别
void con_count(contacts l)
{
int count =0;
if(NULL==l||con_empty(l))
{
printf("链表不存在或者为空无法统计性别\n");
return;
}
//定义一个遍历指针从第一个结点开始
contacts q=l->next;
while(q!=NULL)
{
if(strcmp(q->sex,"man")==0)
{
count++;
}
q=q->next;
}
printf("性别为男的有%d个",count);
printf("性别为女的有%d个",l->len-count);
printf("\n");
}
main.c:
#include"project.h"
#include<stdlib.h>
#include <stdio.h>
#include<string.h>
int main(int argc, const char *argv[])
{
int menu1; //一级功能菜单
int menu2; //二级功能菜单
int menu3; //辅助功能菜单
char username[20]; //用户名
char pwd[20]; //密码
//调用创建链表函数
contacts l=con_create();
if(NULL==l)
{
return -1;
}
while(1)
{
start:
printf("******************用户登录界面*********************\n");
printf("******************1.用户注册***********************\n");
printf("******************2.用户登录***********************\n");
printf("******************0.用户退出***********************\n");
printf("请输入功能选项:");
scanf("%d",&menu1);
switch(menu1)
{
case 1:
{
for(;;)
{
printf("请输入注册账号:");
scanf("%s",username);
printf("请输入注册密码:");
scanf("%s",pwd);
if(strlen(pwd)<6||strlen(pwd)>6)
{
printf("您输入的密码不规范,请您输入的6位数密码\n");
}
else
{
printf("注册成功\n");
break;
}
}
//记录用户注册的账号和密码到新的文件中
FILE *fp=fopen("./project.txt","a+");
if(NULL==fp)
{
printf("文件打开失败\n");
return -1;
}
//将信息保存到文件中
fprintf(fp,"%s %s\n",username,pwd);
//关闭文件
fclose(fp);
}
break;
/*********************************************************************************/
case 2:
{
char name[20];
char password[20];
printf("请输入用户名:");
scanf("%s",name);
printf("请输入用户密码:");
scanf("%s",password);
//打开文件进行用户名密码比对
//打开记录用户信息的文本
FILE *fp=fopen("./project.txt","r");
if(NULL==fp)
{
printf("打开账号文本失败\n");
return -1;
}
//开始进行比对
while(!feof(fp))
{
//读取信息
fscanf(fp,"%s %s",username,pwd);
if(strcmp(username,name)==0&&strcmp(pwd,password)==0)
{
printf("登陆成功\n");
printf("进入二级功能菜单,请进行功能选择\n");
while(1)
{
two:
printf("*************功能选择界面*************\n");
printf("*************1.创建模块***************\n");
printf("*************2.添加信息***************\n");
printf("*************3.查找信息***************\n");
printf("*************4.修改信息***************\n");
printf("*************5.删除信息***************\n");
printf("*************6.插入信息***************\n");
printf("*************7.展示信息***************\n");
printf("*************8.导出信息***************\n");
printf("*************9.按照姓名将通讯录排序***\n");
printf("*************0.返回上一级*************\n");
printf("*************11.辅助功能***************\n");
printf("请输入功能选项:");
scanf("%d",&menu2);
switch(menu2)
{
case 1:
{
printf("已成功创建员工管理系统模块\n");
break;
}
case 2:
{
//添加信息模块
datatype n[20];
char x[10];
int b;
datatype h[20];
printf("请输入需要添加的员工姓名\n");
scanf("%s",n);
printf("请输入该员工的性别\n");
scanf("%s",x);
printf("请输入该员工的编号\n");
scanf("%d",&b);
printf("请输入该员工的电话号码\n");
scanf("%s",h);
con_insert(l,n,x,b,h);
break ;
}
case 3:
{
//按照姓名查找信息功能模块
datatype n[20];
printf("请输入需要查找的员工姓名\n");
scanf("%s",n);
con_search_name(l,n);
break;
}
case 4:
{
//按找名字修改信息功能模块
datatype n[20];
datatype new_n[20];
char x[10];
int b;
datatype h[20];
printf("请输入需要修改员工信息的员工姓名\n");
scanf("%s",n);
printf("请输入修改之后该员工姓名\n");
scanf("%s",new_n);
printf("请输入该员工的性别\n");
scanf("%s",x);
printf("请输入该员工的编号\n");
scanf("%d",&b);
printf("请输入该员工的电话号码\n");
scanf("%s",h);
con_update_name(l,n,new_n,x,b,h);
break;
}
case 5:
{
//删除员工信息功能模块
datatype n[20];
printf("请输入需要删除的员工姓名\n");
scanf("%s",n);
con_delete_value(l,n);
break;
}
case 6:
{
//按照位置插入员工信息功能
int pos=0;
printf("请输入需要插入的位置\n");
scanf("%d",&pos);
datatype n[20];
char x[10];
int b;
datatype h[20];
printf("请输入需要添加的员工姓名\n");
scanf("%s",n);
printf("请输入该员工的性别\n");
scanf("%s",x);
printf("请输入该员工的编号\n");
scanf("%d",&b);
printf("请输入该员工的电话号码\n");
scanf("%s",h);
//调用申请结点封装函数将想要的信息放进去
contacts e=con_apply(n,x,b,h);
//调用插入信息函数
con_insert_pos(l,pos,e);
break;
}
case 7:
{
//展示信息功能函数
con_show(l);
break;
}
case 8:
{
//导出信息功能
con_put(l);
break;
}
case 9:
{
//按姓名排序功能
con_sort(l);
printf("通讯录已经排序完成如下所示\n");
con_show(l);
break;
}
case 0:
{
goto start;
}
case 11:
{
while(1)
{
printf("****************辅助功能选择界面****************\n");
printf("****************1.初始化链表********************\n");
printf("****************2.获取链表长度******************\n");
printf("****************3.统计性别**********************\n");
printf("****************0.返回上一级********************\n");
printf("请输入辅助功能选择项:");
scanf("%d",&menu3);
switch(menu3)
{
case 1:
{
//初始化链表功能模块
con_end(l);
break;
}
case 2:
{
//获取链表长度功能
int i=con_len(l);
printf("链表长度为:%d\n",i);
break;
}
case 3:
{
//统计性别功能
con_count(l);
break;
}
case 0:
{
goto two;
}
}
}
}
}
}
//关闭账号文本
fclose(fp);
break;
} //case2结束
else{
printf("登录失败\n");
}
/****************************************************************************************/
}
}
case 0:
{
break;
}
}
}
return 0;
}