通讯录(结构体数组篇)

1. 大致思路

        刚开始就申请一段结构体数组空间用于存放联系人信息,通过count来确定该空间的有效长度,一切操作都是基于count的变化来完成的;

2. 优缺点

  2.1. 优点

    效率较快,操作简单,代码量少

  2.2. 缺点

    刚开始申请了大量内存,数据太少会造成,数据过大时修改比较麻烦

3.代码:

        addressBook.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define Max 1000 //最大存储人数

enum OP{
	EXIT,
	ADD,
	FIND,
	SHOW,
	MODIFY,
	DELE,
	EMPTY,
	SORT,
	SAVE
}; //使用枚举类型列举出操作,可看作是对0-8的简单化宏定义

typedef struct Stu{
	char name[10];
	char sex[3];
	int age;
	char phone[12];
	char address[30];
}Stu;//个人信息

typedef struct AddressBook{
	Stu stu[Max];
	int count;
}AddressBook,* ptxl;//通讯录

void initiate(ptxl ptxl);//初始化通讯录
void add(ptxl ptxl);//添加一个信息
void find(ptxl ptxl);//查找一个信息
void show(ptxl ptxl);//显示所有信息
void modify(ptxl ptxl);//修改一个信息
void dele(ptxl ptxl);//删除一个信息
void empty(ptxl ptxl);//清空通讯录
void sort(ptxl ptxl);//按名字排序所有信息
void save(ptxl ptxl);//保存一个信息
void menu();//通讯录初始界面,打印一个菜单

static int check(ptxl ptxl,const char * name){
	int i = 0;
	for(;i < ptxl ->count;i++){
		if(strcmp(name,ptxl->stu[i].name) == 0){
			return i;
		}
	}
	return -1;
} // 查询函数,查找是否有需要操作的人

void initiate(ptxl ptxl){
	ptxl -> count = 0;
} //初始化函数

void add(ptxl ptxl){
	if(ptxl ->count == Max){
		printf("通讯录已满,请清除部分无用数据后重新尝试添加\n");
		return ;
	}

	printf("姓名:");
	scanf("%s",ptxl -> stu[ptxl -> count].name);

	printf("性别:");
	scanf("%s",ptxl -> stu[ptxl -> count].sex );

	printf("年龄:");
	scanf("%d",&ptxl -> stu[ptxl -> count].age);

	printf("电话:");
	scanf("%s",ptxl -> stu[ptxl -> count].phone);	

	printf("住址:");
	scanf("%s",ptxl -> stu[ptxl -> count].address);

	ptxl ->count ++;
	printf("添加成功!\n");
}

void find(ptxl ptxl){
	int ret = 0;
	char name[10];

	printf("请输入要查找人的姓名");
	scanf("%s",name);

	ret = check(ptxl,name);
	if(ret == -1){
		printf("通讯录中没有要查找的人\n");
		return ;
	}else{
		printf("姓名\t性别\t年龄\t电话\t\t住址\n");
		printf("%s\t%s\t%d\t%s\t%s\n",ptxl->stu[ret].name,ptxl->stu[ret].sex,ptxl->stu[ret].age,ptxl->stu[ret].phone,ptxl->stu[ret].address);
	}
}

void show(ptxl ptxl){
	int i = 0;
	printf("姓名\t性别\t年龄\t电话\t\t住址\n");

	for(;i < ptxl ->count;i++){
		printf("%s\t%s\t%d\t%s\t%s\n",ptxl->stu[i].name,ptxl->stu[i].sex,ptxl->stu[i].age,ptxl->stu[i].phone,ptxl->stu[i].address);
	}
}

void modify(ptxl ptxl){
	int ret = 0;
	char name[10];

	printf("请输入要修改人的姓名");
	scanf("%s",name);

	ret = check(ptxl,name);
	if(ret == -1){
		printf("通讯录中没有此人,无法修改\n");
		return ;
	}else{
		printf("姓名:");
		scanf("%s",ptxl -> stu[ret].name);

		printf("性别:");
		scanf("%s",ptxl -> stu[ret].sex );

		printf("年龄:");
		scanf("%d",&ptxl -> stu[ret].age);

		printf("电话:");
		scanf("%s",ptxl -> stu[ret].phone);	

		printf("住址:");
		scanf("%s",ptxl -> stu[ret].address);
	}
}

void dele(ptxl ptxl){
	int ret = 0;
	char name[10];
	int j = 0;

	printf("请输入要修改人的姓名");
	scanf("%s",name);

	ret = check(ptxl,name);
	if(ret == -1){
		printf("通讯录中没有此人,无法删除\n");
		return ;
	}else{
		for(j = ret;j < ptxl ->count -1;j++){
			ptxl->stu[j] = ptxl->stu[j + 1];
		}
	}
	ptxl -> count--;
	printf("删除成功\n");
}
 
void empty(ptxl ptxl){
	ptxl ->count = 0;
	printf("通讯录已清空");
}

void sort(ptxl ptxl){
	int i = 0;
	int j = 0;
	for(;i < ptxl->count;i++){
		for(j = i + 1;i < ptxl->count;j++){
			if(strcmp(ptxl ->stu[i].name,ptxl ->stu[j].name) > 0){
				Stu temp = ptxl -> stu[i];
				ptxl ->stu[i] = ptxl ->stu[j];
				ptxl ->stu[j] = temp;
			}
		}
	}
}

void save(ptxl ptxl){
	FILE *fp;
	int i = 0;

	fp = fopen("list","w");
	if(!fp){
		perror("文件打开失败");
		exit(1);
	}

	while(i < ptxl -> count){
		fwrite(&ptxl->stu[i],sizeof(Stu),1,fp);
		i++;
	}

	fclose(fp);
	printf("联系人保存文件完毕\n");
	return ;
}

void menu(){
	printf("**************************\n");
	printf("**  班级通讯录管理系统  **\n");
	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("    [0]退出通讯录\n");
	printf("**************************\n");
}

int main(){
	AddressBook txl;
	int input = 1;

	initiate(&txl);

	while(input){
		menu();
		printf("请输入你要做的操作(0-8):");
		scanf("%d",&input);
		switch(input){
		case ADD:
			add(&txl);
			break;
		case FIND:
			find(&txl);
			break;
		case SHOW:
			show(&txl);
			break;
		case MODIFY:
			modify(&txl);
			break;
		case DELE:
			dele(&txl);
			break;
		case EMPTY:
			empty(&txl);
			break;
		case SORT:
			sort(&txl);
			break;
		case SAVE:
			save(&txl);
			break;
		case EXIT:
			exit(EXIT_SUCCESS);
			break;
		}

	}
	return 0;
}

4.运行效果图

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值