C语言-静态实现通讯录

前言:在了解了数据结构和指针的用法后,我们可以写一个录入信息的通讯录。但是无法保存输入的内容,后续再做一个可以保存的

一.静态实现

1.头文件

以下是所需要的函数以及结构体:增删查找排序以及打印

静态的结构体只需要 给开辟一块连续的空间 以及记录这个空间已经被占用了多少的 一个sz来记录。由于静态的需要一开始就给开辟一块规定的空间,如果不够用则无法增加,如果一下开一万个太多,浪费空间,这就是他的缺点。

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>


//首先需要建立一个通讯录,通讯录由多个个体组成(结构),结构内包含人的信息,如姓名、年龄、联系方式等
#define PERSON_MAX 20	//通讯录里最多能存多少个人
//首先我们先实现一个静态的通讯录 
//一下是对人建立一个所需要的数据结构

#define NAME_MAX 20		//名字的最长长度		
#define TELE_MAX 15		//电话号最长长度
#define SEX_MAX 5		//年龄最长长度


typedef struct People    //这个结构体包含了人的名字电话性别年龄
{
	char name[NAME_MAX];
	char tele[TELE_MAX];
	char sex[SEX_MAX];
	int age;
}People;


//建立一个通讯录,里面包含 人的数据 和 记录以及用了多少空间
typedef struct Contact
{
	People person[PERSON_MAX];	//开始就给要创建的用户的数量  通讯录里的人数是固定的
	int sz;					//记录以及存了多少个人的通讯录
}Contact;

void add_contact(Contact* p);		//添加通讯人

void show_contact(Contact* p);		//展示一下通讯录里的人

void del_contact(Contact* p);		//删除人

void search_contact(Contact* p);	//查找指定联系人并打印出来

void sort_contact(Contact* p);

void modify_contact(Contact* p);	//查找指定的人并修改#pragma once

2.主结构

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include "head.h"

void entitle()//打印一个标题 给予提示作用
{
	printf("—————————————————————————\n");
	printf("—————————————————————————\n");
	printf("———————  0.EXIT    1.ADD   ————————\n");
	printf("———————  2.DEL     3.SHOW  ————————\n");
	printf("———————  4.SEARCH  5.SORT  ————————\n");
	printf("———————       6.MODIFY     ————————\n");
	printf("—————————————————————————\n");
	printf("—————————————————————————\n");

}

enum
{
	EXIT,
	ADD,
	DEL,
	SHOW,
	CHECK,
	SORT,
	MODIFY,
};


int main()
{
	Contact C = { 0 };    //给初始化
	int input = 0;
	do
	{
		entitle();
		scanf("%d", &input);
		switch (input)
		{
		case ADD:						//add实现
			add_contact(&C);
			break;
		case DEL:
			del_contact(&C);
			break;
		case SHOW:
			show_contact(&C);
			break;
		case CHECK:
			search_contact(&C);
			break;
		case SORT:
			sort_contact(&C);
			break;
		case MODIFY:
			modify_contact(&C);
			break;
		case EXIT:
			printf("退出成功\n");
			break;
		default:
			printf("输入错误请重新输入\n");
			break;
		}
	} while (input);
}

3.函数的实现部分

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include "head.h"

void add_contact(Contact* p)
{
	if (p->sz == PERSON_MAX)
	{
		printf("已满\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", p->person[p->sz].name);
	printf("请输入年龄:");
	scanf("%d", &p->person[p->sz].age);
	printf("请输入性别:");
	scanf("%s", p->person[p->sz].sex);
	printf("请输入电话号码:");
	scanf("%s", p->person[p->sz].tele);

	p->sz++;
	printf("添加成功\n");
}


void show_contact(Contact* p)
{
	printf("%10s %5s %5s %5s\n", "姓名", "年龄", "性别", "电话");
	for (int i = 0; i < p->sz; i++)
	{
		printf("%10s", p->person[i].name);
		printf("%5d", p->person[i].age);
		printf("%5s", p->person[i].sex);
		printf("%15s", p->person[i].tele);
		printf("\n");
	}

}

void del_contact(Contact* p)
{
	if (p->sz == 0)
	{
		printf("已空\n");
		return;
	}
	else
	{
		char name[NAME_MAX];
		printf("请输入要删除人的名字:\n");
		scanf("%s", name);
		int pos = find_people_by_name(p, name);	//1.找到要删除的人,遍历并比较名字之类的,我们写一个函数来封装查找
		if (pos == -1)
		{
			printf("查无此人,无法删除\n");
		}
		else
		{
			for (int i = pos; i < p->sz - 1; i++)	//这里需要注意!!!如果sz最大为20已经装满了,20+1则越界了所以要减一 
			{
				p->person[i] = p->person[i + 1]; //假设现在满了,20是最大,21->20 越界了;
			}
			p->sz--;
			printf("删除成功\n");
		}

	}
}

static int find_people_by_name(Contact* pc, char name[NAME_MAX]) //只能在自己的源文件内才能看见
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(name, pc->person[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void search_contact(Contact* p)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找人的名字:\n");
	scanf("%s", name);
	int pos = find_people_by_name(p, name);
	if (pos == -1)
	{
		printf("查无此人");
	}
	else
	{
		printf("%10s %5s %5s %5s\n", "姓名", "年龄", "性别", "电话");

		printf("%10s", p->person[pos].name);
		printf("%5d", p->person[pos].age);
		printf("%5s", p->person[pos].sex);
		printf("%15s", p->person[pos].tele);
		printf("\n");

	}
}

void sort_contact(Contact* p)
{


	for (int i = 0; i < p->sz - 1; i++)
	{
		int flag = 1;				// 立个标志
		for (int j = 0; j < p->sz - 1 - i; j++)
		{
			if (p->person[j].age > p->person[j + 1].age)	//以年龄的大小来排序
			{
				People tem;
				tem = p->person[j];
				p->person[j] = p->person[j + 1];
				p->person[j + 1] = tem;
				flag = 0;
			}
		}
		if (1 == flag) //如果一次交换都没有直接就跳出 不需要进行以后的交换了
		{
			break;
		}
	}
}

void modify_contact(Contact* p)   //可以做修改 选择要修改名字 还是其他内容 我这里选择都修改
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的名字:\n");
	scanf("%s", name);
	int pos = find_people_by_name(p, name);
	if (pos == -1)
	{
		printf("查无此人\n");
	}
	else
	{
		printf("请输入新的名字:");
		scanf("%s", p->person[pos].name);
		printf("请输入新的年龄:");
		scanf("%d", &p->person[pos].age);
		printf("请输入新的性别:");
		scanf("%s", p->person[pos].sex);
		printf("请输入新的电话号码:");
		scanf("%s", p->person[pos].tele);
		printf("修改成功\n");
	}
}

请注意实现对年龄输入时需要加上取地址&符号,其他都是数组,数组名就是地址,但是age是变量所以需要取地址

实现:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值