C语言用链表实现通讯录管理系统

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

模块:
一级菜单内容
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值