实现动态通讯录

//////////////////////////////// .h文件  /////////////////////////////
#pragma once 

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//实现一个通讯录;
//通讯录可以用来存储1000个人的信息,每个人的信息包括:
//姓名、性别、年龄、电话、住址
//
//提供方法:

//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
//7. 以名字排序所有联系人


#define MAX_SIZE 1000

typedef struct Measage
{
	char name[20];
	int gender;
	int age;
	char tel[20];
	char addr[20];
}*MList;

typedef struct List
{
	MList Man[MAX_SIZE];
	int Size;
}People;       // people * s          s->Man[s->Size]->name


void AddMan(People* s);
void InitMan(People* s);
void DeleteMan(People* s);
int FindMan(People* s);
void ReviseMan(People* s);
void Display(People* s);
void SortMan(People* s);


//////////////////////////// .c 实现文件 //////////////////////////////

#include "标头.h"
#pragma warning(disable:4996)
void InitMan(People* s)
{
	s->capasize = MAX_SIZE;
	s->Man = malloc(MAX_SIZE * sizeof(List));
	s->Size = 0;
	printf("清理成功\n");
}

void IncreaseMan(People* s)
{
	assert(s);
	s->capasize = s->capasize + INCREASEMENT;
	s->Man = realloc(s->Man, s->capasize * sizeof(List));
}

//引发了异常: 读取访问权限冲突。
//**s** 是 0x34F42096。 出现了
void AddMan(People* s)
{
	if (s->Size == MAX_SIZE - 1) {
		IncreaseMan(s);
	}
	printf("\n");
	printf("\n");
	printf("现在进行添加联系人操作\n");
	getchar();
	printf("请输入姓名\n");
	gets(s->Man[s->Size].name);
	printf("请输入性别 1.男性   2.女性\n");
	scanf_s("%d", &(s->Man[s->Size].gender));
	getchar();
	printf("请输入地址\n");
	gets(s->Man[s->Size].addr);
	printf("请输入年龄\n");
	scanf_s("%d", &(s->Man[s->Size].age));
	getchar();
	printf("请输入十一位电话号码\n");
	gets(s->Man[s->Size].tel);
	++s->Size;
}

void DeleteMan(People* s)
{
	int i = 0;
	int flag = 1;
	char str[20];
	if (s == NULL) {
		printf("空\n");
		return;
	}
	printf("\n");
	printf("\n");
	printf("请输入您要删除的联系人的姓名\n");
	getchar();
	gets(str);
	while (i < s->Size) {
		if (strcmp(s->Man[i].name, str) == 0) {
			flag = 0;
			while (i < (s->Size) - 1) {
				s->Man[i] = s->Man[i + 1];
				++i;
			}
			--s->Size;
			break;
		}
		++i;
	}
	if (flag) {
		printf("无此联系人信息\n");
	}
	printf("联系人信息已删除\n");
	printf("\n");
	printf("\n");
}


int FindMan(People* s)
{
	assert(s);
	int i = 0;
	int flag = 1;
	char str[20];
	printf("请输入您要查找的联系人的姓名\n");
	getchar();
	gets(str);
	while (i < s->Size) {
		if (strcmp(s->Man[i].name, str) == 0) {
			flag = 0;
			printf("\n");
			printf("\n");
			printf("电话:%s\n", s->Man[i].tel);
			if ((s->Man[i]).gender == 1) {
				printf("性别男\n");
			}
			else {
				printf("性别女\n");
			}
			printf("年龄 %d\n", s->Man[i].age);
			printf("地址:%s\n", s->Man[i].addr);
			printf("\n");
			printf("\n");
			break;
		}
		++i;
	}
	if (flag) {
		printf("未找到联系人信息\n");
		return -1;
	}
	return i;
}


void ReviseMan(People* s)
{
	int i = FindMan(s);
	if (i == -1) {
		return;
	}
	else {
		printf("\n");
		printf("\n");
		printf("现在进行修改联系人操作\n");
		getchar();
		printf("请输入姓名\n");
		gets(s->Man[s->Size].name);
		printf("请输入性别 1.男性   2.女性\n");
		scanf_s("%d", &(s->Man[s->Size].gender));
		getchar();
		printf("请输入地址\n");
		gets(s->Man[s->Size].addr);
		printf("请输入年龄\n");
		scanf_s("%d", &(s->Man[s->Size].age));
		getchar();
		printf("请输入十一位电话号码\n");
		gets(s->Man[s->Size].tel);
		printf("\n");
		printf("\n");
	}
}


void Display(People* s)
{
	assert(s);
	int i = 0;
	while (i < s->Size) {
		printf("\n");
		printf("\n");
		printf("姓名:%s\n", s->Man[i].name);
		printf("电话:%s\n", s->Man[i].tel);
		if (s->Man[i].gender == 1) {
			printf("性别男\n");
		}
		else {
			printf("性别女\n");
		}
		printf("年龄 %d\n", s->Man[i].age);
		printf("地址:%s\n", s->Man[i].addr);
		++i;
		printf("\n");
		printf("\n");
	}
}


void SortMan(People* s)//按照名字首字母排序
{
	int i = 0;
	int j = 0;
	char tmp[20];
	int flag = 1;
	for (; i < s->Size - 1; ++i) {
		for (; j < s->Size - 1 - i; ++j) {
			if (strcmp(s->Man[i].name, s->Man[i + 1].name) == 1) {
				flag = 0;
				strcpy(tmp, s->Man[i].name);
				strcpy(s->Man[i].name, s->Man[i + 1].name);
				strcpy(s->Man[i + 1].name, tmp);
			}//交换功能代码块
		}
		if (flag)
			break;
	}
}

///////////////////////////  测试文件  /////////////////////////////

#include "标头.h"
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
//7. 以名字排序所有联系人
void MENU()
{
	printf("/////////////////// 通讯录 ////////////////////\n");
	printf("////////////// 按键选择相应服务 ///////////////\n");
	printf("//1. 添加联系人信息     2. 删除指定联系人信息//\n");
	printf("//3. 查找指定联系人信息 4. 修改指定联系人信息//\n");
	printf("//5. 显示所有联系人信息 6. 清空所有联系人//////\n");
	printf("////////////7. 以名字排序所有联系人////////////\n");
}


int main() {
	People p;
	int i = 1, j;
	while (i != 0) {
		MENU();
		scanf_s("%d", &i);
		switch (i)
		{
		case 1:
			AddMan(&p);
			break;
		case 2:
			DeleteMan(&p);
			break;
		case 3:
			j = FindMan(&p);
			break;
		case 4:
			ReviseMan(&p);
			break;
		case 5:
			Display(&p);
			break;
		case 6:
			InitMan(&p);
			break;
		case 7:
			SortMan(&p);
			break;
		default:
			break;
		}
	}
	printf("退出\n");
	system("pause");
	return 0;
}

posted @ 2018-05-27 19:10  千山路马  阅读(154)  评论(0)    收藏  举报