实现简单的动态通讯录

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人

使用柔性数组可以实现动态;

#ifndef _LINKMAN_H_
#define _LINKMAN_H_

#include<stdio.h>
#include<Windows.h>
#include<string.h>
#pragma warning(disable:4996)

typedef struct Linkman
{
	char name[20];
	char sex[10];
	int age;
	char tel[20];
	char addr[30];
}Linkman;

typedef struct Statis
{
	int count;
	Linkman f_arr[0];
}Statis;

void add_linkman(Statis *p, int num);
void del_linkman(Statis *p);
void find_linkman(Statis *p);
void revise_linkman(Statis *p);
void display_linkman(Statis *p);
void clear_linkman(Statis *p);
void sort_linkman(Statis *p);
int search(Statis *p, char *name);
void menu_r();

#endif


#include"linkman.h"

Statis *sta;

void menu()
{
	printf("##############################################\n");
	printf("#########     1. 添加联系人信息      #########\n");
	printf("#########     2. 删除联系人信息      #########\n");
	printf("#########     3. 查找联系人信息      #########\n");
	printf("#########     4. 修改联系人信息      #########\n");
	printf("#########   5. 显示所有联系人信息    #########\n");
	printf("#########   6. 清空所有联系人信息    #########\n");
	printf("#########   7. 按名字排序所有人信息  #########\n");
	printf("#########         0.退出程序         #########\n");
	printf("##############################################\n");
	printf("请输入想要执行的操作:\n");
}

void SaveFile(Statis *p)
{
    FILE* p_file = fopen("addressbook.txt", "a+");
    char s[] = "姓名     性别     年龄     电话     地址";
    if(p_file != NULL)
    {
        fprintf(p_file, "%s\n", &s);
        for(int i=0; i<p->size; i++)
        {
            fprintf( p_file, "%-9s ", &p->f_arr[i].name);
            fprintf( p_file, "%-9s ", &p->f_arr[i].sex);
            fprintf( p_file, "%-9d ", p->f_arr[i].age);
            fprintf( p_file, "%-9s ", &p->f_arr[i].tel);
            fprintf( p_file, "%-9s \n", &p->f_arr[i].addr);
        }
    }
    fclose(p_file);
    p_file = NULL;
}

int main()
{
	int num = 0;
	printf("请输入要创建的联系人个数:\n");
	scanf("%d", &num);
	sta = (Statis *)malloc(sizeof(Statis)+num*sizeof(Linkman));
	if (sta == NULL){
		exit(EXIT_FAILURE);
	}
	sta->count = num;
	int select = 0;
	do{
		menu();
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			add_linkman(sta, num);
			break;
		case 2:
			del_linkman(sta);
			break;
		case 3:
			find_linkman(sta);
			break;
		case 4:
			revise_linkman(sta);
			break;
		case 5:
			display_linkman(sta);
			break;
		case 6:
			clear_linkman(sta);
			break;
		case 7:
			sort_linkman(sta);
			break;
		case 0:
			printf("再见!\n");
                                                      SaveFile(sta);
                                                      exit(1);
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (1);
	free(sta);
	sta = NULL;
	system("pause");
	return 0;
}


#include"linkman.h"

void menu_r()
{
	printf("#############################################\n");
	printf("######   1.姓名              2.性别    ######\n");
	printf("######   3.年龄              4.电话    ######\n");
	printf("######   5.地址              0.退出    ######\n");
	printf("#############################################\n");
	printf("请输入需要修改的选项:\n");
}

int search(Statis *p, char *name)
{
	int i = 0;
	for (i = 0; i < (p->count); i++)
	{
		if (strcmp(p->f_arr[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void add_linkman(Statis *p, int num)
{
	if ((p->count)-num == num)
	{
		printf("达到添加上限!\n");
	}
	else
	{
		printf("请输入需要添加的联系人姓名:\n");
		scanf("%s", p->f_arr[p->count].name);
		printf("请输入需要添加的联系人性别:\n");
		scanf("%s", p->f_arr[p->count].sex);
		printf("请输入需要添加的联系人年龄:\n");
		scanf("%d", &p->f_arr[p->count].age);
		printf("请输入需要添加的联系人电话:\n");
		scanf("%s", p->f_arr[p->count].tel);
		printf("请输入需要添加的联系人地址:\n");
		scanf("%s", p->f_arr[p->count].addr);
		printf("添加成功!\n");
		p->count++;
	}
}

void del_linkman(Statis *p)
{
	char name[20] = { 0 };
	int result;
	int i;
	printf("请输入需要删除的联系人姓名:\n");
	scanf("%s", name);
	result = search(p, name);
	if (result != -1)
	{
		printf("您确定要删除此联系人?\n");
		printf("删除请输入1,不删除请输入0!\n");
		scanf("%d", &i);
		if (i == 1)
		{
			for (i = 0; i < (p->count) - 1; i++)
			{
				p->f_arr[i] = p->f_arr[i + 1];
			}
			p->count--;
			printf("删除成功!\n");
		}
		else
		{
			printf("删除失败!\n");
		}
	}
	else
	{
		printf("您输入的联系人不存在!\n");
	}
}

void find_linkman(Statis *p)
{
	char name[20] = { 0 };
	int result = 0;
	printf("请输入需要查找的联系人姓名:\n");
	scanf("%s", name);
	result = search(p, name);
	if (result != -1)
	{
		printf("姓名:%s\n", p->f_arr[result].name);
		printf("性别:%s\n", p->f_arr[result].sex);
		printf("年龄:%d\n", p->f_arr[result].age);
		printf("电话:%s\n", p->f_arr[result].tel);
		printf("地址:%s\n", p->f_arr[result].addr);
	}
	else
	{
		printf("您输入的联系人不存在!\n");
	}
}

void revise_linkman(Statis *p)
{
	char name[20] = { 0 };
	int result = 0;
	int i = 0;
	printf("请输入需要修改的联系人姓名:\n");
	scanf("%s", name);
	result = search(p, name);
	if (result != -1)
	{
		printf("姓名:%s\n", p->f_arr[result].name);
		printf("性别:%s\n", p->f_arr[result].sex);
		printf("年龄:%d\n", p->f_arr[result].age);
		printf("电话:%s\n", p->f_arr[result].tel);
		printf("地址:%s\n", p->f_arr[result].addr);
		do{
			menu_r();
			scanf("%d", &i);
			switch (i)
			{
			case 1:
				printf("请输入您想改的名字:\n");
				scanf("%s", p->f_arr[result].name);
				break;
			case 2:
				printf("请输入您想改的性别:\n");
				scanf("%s", p->f_arr[result].sex);
				break;
			case 3:
				printf("请输入您想改的年龄:\n");
				scanf("%d", &(p->f_arr[result].age));
				break;
			case 4:
				printf("请输入您想改的电话:\n");
				scanf("%s", p->f_arr[result].tel);
				break;
			case 5:
				printf("请输入您想改的地址:\n");
				scanf("%s", p->f_arr[result].addr);
				break;
			case 0:
				break;
			default:
				printf("输入错误,请重新输入!\n");
			}
		} while (i);
	}
	else
	{
		printf("您输入的联系人不存在!\n");
	}
}

void display_linkman(Statis *p)
{
	int i = 0;
	printf("显示所有联系人信息\n");
	printf("%10s%7s%7s%9s%11s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (i = 0; i < (p->count); i++)
	{
		printf("%10s", p->f_arr[i].name);
		printf("%5s", p->f_arr[i].sex);
		printf("%8d", p->f_arr[i].age);
		printf("%14s", p->f_arr[i].tel);
		printf("%9s", p->f_arr[i].addr);
		printf("\n");
	}
}

void clear_linkman(Statis *p)
{
	int i = 0;
	printf("确定清空所有联系人?\n");
	printf("清空请输入1,不清空请输入0!\n");
	scanf("%d", &i);
	if (i == 1)
	{
		p->count = 0;
	}
}

void sort_linkman(Statis *p)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < (p->count) - 1; i++)
	{
		for (j = 0; j < (p->count) - i - 1; j++)
		{
			if (strcmp(p->f_arr[j].name, p->f_arr[j + 1].name)>0)
			{
				Linkman tmp = p->f_arr[j];
				p->f_arr[j] = p->f_arr[j + 1];
				p->f_arr[j + 1] = tmp;
			}
		}
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值