意义:对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度
模块:
一级菜单内容
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> 统计性别;
main.c
#include "linkList.h"
int main(int argc, const char *argv[])
{
int one_flag=0;
one_menu(&one_flag);
while(1){
switch(one_flag){
case 1 : enroll();
break;
case 2 : login();
break;
case 0 : return -1;
default: printf("输入错误,请重新输入\n");
}
one_menu(&one_flag);
}
return 0;
}
linkList.c
#include "linkList.h"
//一级菜单展示
void one_menu(int* flag){
printf("———————————欢迎登录通讯录管理系统———————————\n");
printf("注册请输入:1\n");
printf("登录请输入:2\n");
printf("退出请输入:0\n");
printf("————————————————————————————————————————————\n");
scanf("%d",flag);
}
//二级菜单展示
void two_menu(int *flag){
printf("\n**********登录模块***********\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("统计性别请输入:10\n");
printf("链表初始化请输入: 11\n");
printf("返回上一级请输入:0\n");
printf("*****************************************\n");
scanf("%d", flag);
}
//注册模块
void enroll(){
char username[20]="";
char password[20]="";
printf("请输入用户名:\n");
scanf("%s",username);
printf("请输入密码:\n");
scanf("%s",password);
FILE * file=fopen("./account.txt","w");
fputs(username,file);
fputc('\n',file);
fputs(password,file);
fclose(file);
}
//登录模块
void login(){
char username[20]="";
char password[20]="";
printf("请输入用户名:\n");
scanf("%s",username);
printf("请输入密码:\n");
scanf("%s",password);
FILE * file=fopen("./account.txt","r");
char buf[20]="";
char *data=fgets(buf,sizeof(buf),file);
data[strlen(data)-1]='\0';
if(strcmp(data,username)!=0){
printf("用户名错误\n");
return;
}
data=fgets(buf,sizeof(buf),file);
if(strcmp(data,password)!=0){
printf("密码错误\n");
return;
}
printf("——————————登录成功———————————\n");
int flag=0;
Contacts head=NULL;
two_menu(&flag);
while(1){
switch (flag) {
case 1: head=create();
break;
case 2: add(head);
break;
case 3: findToName(head,0);
break;
case 4: update(head);
break;
case 5: deleteToName(head);
break;
case 6: insertToIndex(head);
break;
case 7: show(head);
break;
case 8: export(head);
break;
case 9: sortToName(head);
break;
case 10: sexStatistics(head);
break;
case 11:initList(head);
break;
case 0:
return;
default: printf("输入错误,请重新输入");
}
two_menu(&flag);
}
}
//创建链表
Contacts create(){
Contacts head=(Contacts)malloc(sizeof(Contact));
if(head==NULL){
printf("创建失败\n");
return NULL;
}
head->length=0;
head->next=NULL;
return head;
}
//申请新节点
Contacts applyContact(){
Contacts node=(Contacts)malloc(sizeof(Contact));
if(node==NULL){
printf("创建失败\n");
return NULL;
}
node->next=NULL;
return node;
}
//链表初始化
void initList(Contacts head){
Contacts p=head->next;
while(head->next){
head->next=p->next;
p->next=NULL;
free(p);
p=head->next;
}
head->length=0;
printf("初始化成功\n");
}
//获得链表长度
int getLength(Contacts head){
return head->length;
}
//批量添加数据
void add(Contacts head){
printf("请输入要添加的联系人数量\n");
int n=0;
scanf("%d",&n);
People people={0};
for(int i=getLength(head);i<getLength(head)+n;i++){
printf("请输入第%d个联系人的信息\n",i+1);
printf("请输入联系人编号:\n");
scanf("%d",&people.id);
printf("请输入联系人姓名:\n");
scanf("%s",people.name);
printf("请输入联系人性别:\n");
scanf("%s",people.sex);
printf("请输入联系人手机号:\n");
scanf("%d",&people.phone);
Contacts node=applyContact();
node->people=people;
node->next=head->next;
head->next=node;
}
head->length+=n;
}
//根据姓名查找
Contacts findToName(Contacts head,int flag){
printf("请输入要查找的姓名:\n");
char name[20]="";
scanf("%s",name);
head=head->next;
while(head){
if(strcmp(name,head->people.name)==0){
if(flag==0){
printf("您要查找的联系人编号:%d,姓名:%s,性别:%s,手机:%d\n",
head->people.id,head->people.name,head->people.sex
,head->people.phone);
}else{
printf("您要修改的联系人编号:%d,姓名:%s,性别:%s,手机:%d\n",
head->people.id,head->people.name,head->people.sex
,head->people.phone);
}
return head;
}
head=head->next;
}
printf("学生不存在\n");
return NULL;
}
//修改信息
void update(Contacts head){
Contacts node=findToName(head,1);
if(node==NULL){
return;
}
int flag=0;
printf("修改编号请输入:1\n");
printf("修改姓名请输入:2\n");
printf("修改性别请输入:3\n");
printf("修改手机号请输入:4\n");
printf("修改全部请输入:5\n");
scanf("%d",&flag);
switch(flag){
case 1: printf("请输入要修改的编号:\n");
scanf("%d",&node->people.id);
break;
case 2: printf("请输入要修改的姓名:\n");
scanf("%s",node->people.name);
break;
case 3: printf("请输入要修改的性别:\n");
scanf("%s",node->people.sex);
break;
case 4: printf("请输入要修改的手机号:\n");
scanf("%d",&node->people.phone);
break;
case 5:
printf("请输入要修改的编号:\n");
scanf("%d",&node->people.id);
printf("请输入要修改的姓名:\n");
scanf("%s",node->people.name);
printf("请输入要修改的性别:\n");
scanf("%s",node->people.sex);
printf("请输入要修改的手机号:\n");
scanf("%d",&node->people.phone);
break;
default:printf("输入错误\n");
}
}
//根据姓名删除
void deleteToName(Contacts head){
printf("请输入要删除的学生姓名\n");
char name[20]="";
scanf("%s",name);
Contacts q=head;
while(q->next!=NULL){
if(strcmp(name,q->next->people.name)==0){
Contacts p=q->next;
q->next=p->next;
p->next=NULL;
free(p);
head->length--;
printf("删除成功\n");
return;
}
}
printf("学生不存在\n");
}
//根据指定位置插入
void insertToIndex(Contacts head){
Contacts p=head;
printf("请输入要添加的位置:\n");
int index=-1;
scanf("%d",&index);
if(head==NULL||index<0||index>head->length){
printf("插入失败\n");
return;
}
Contacts node=applyContact();
printf("请输入要插入的编号:\n");
scanf("%d",&node->people.id);
printf("请输入要插入的姓名:\n");
scanf("%s",node->people.name);
printf("请输入要插入的性别:\n");
scanf("%s",node->people.sex);
printf("请输入要插入的手机号:\n");
scanf("%d",&node->people.phone);
while(index--){
p=p->next;
}
node->next=p->next;
p->next=node;
head->length++;
printf("插入成功");
}
//展示信息
void show(Contacts head){
Contacts p=head->next;
while(p){
printf("联系人编号:%d,姓名:%s,性别:%s,手机:%d\n",
p->people.id,p->people.name,p->people.sex
,p->people.phone);
p=p->next;
}
}
//导出数据到文件
void export(Contacts head){
FILE* file =fopen("./data.txt","w");
char data[20]="";
head=head->next;
int count=1;
while(head){
fputs("联系人的信息:",file);
sprintf(data,"%d",head->people.id);
fputs(data,file);
fputc('\t',file);
fputs(head->people.name,file);
fputc('\t',file);
fputs(head->people.sex,file);
fputc('\t',file);
sprintf(data,"%d",head->people.phone);
fputs(data,file);
fputc('\n',file);
head=head->next;
}
fclose(file);
printf("导出完成\n");
}
//根据姓名排序
void sortToName(Contacts head){
Contacts p=head->next;
for(int i=1;i<head->length;i++){
for(int j=0;j<head->length-i;j++){
if(strcmp(p->people.name,p->next->people.name)>0){
People temp;
temp=p->people;
p->people=p->next->people;
p->next->people=temp;
}
p=p->next;
}
p=head->next;
}
}
//统计性别
void sexStatistics(Contacts head){
int ncount=0;
int vcount=0;
head=head->next;
while(head){
if(strcmp(head->people.sex,"男")==0){
ncount++;
}else{
vcount++;
}
head=head->next;
}
printf("男生%d个,女生%d个\n",ncount,vcount);
}
linkList.h
#ifndef LINK
#define LINK
#include <myhead.h>
typedef struct{
int id;
char name[20];
char sex[4];
int phone;
}People,*PeoplePtr;
typedef struct Contact{
union{
People people;
int length;
};
struct Contact * next;
}Contact,*Contacts;
//一级菜单展示
void one_menu(int *flag);
//二级菜单展示
void two_menu(int *flag);
//注册模块
void enroll();
//登录模块
void login();
//创建链表
Contacts create();
//申请新节点
Contacts applyContact();
//链表初始化
void initList(Contacts head);
//获得链表长度
int getLength(Contacts head);
//批量添加数据
void add(Contacts head);
//根据姓名查找
Contacts findToName(Contacts head,int flag);
//修改信息
void update(Contacts head);
//根据姓名删除
void deleteToName(Contacts head);
//根据指定位置插入
void insertToIndex(Contacts head);
//展示信息
void show(Contacts head);
//导出数据到文件
void export(Contacts head);
//根据姓名排序
void sortToName(Contacts head);
//统计性别
void sexStatistics(Contacts head);
#endif
1万+

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



