C语言教程:实现通讯录

一、通讯录头文件

通讯录包括5个功能:增加信息,打印信息,删除信息,查找信息,修改信息,我们使用结构体来创建通讯录
头文件如下:

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

#define namemax  255
#define sexmax   20
#define telemax  30
#define addrmax  50
#define  MAX      1000
struct people
{
	char name[namemax];
	int age;
	char sex[sexmax];
	char tele[telemax];
	char addr[addrmax];

};
struct contact
{
	struct people data[MAX];
	int sz;
};
//初始化通讯录
void initcontact(struct contact*pc);
//增加信息
void addcontact(struct contact *pc);
//打印信息
void showcontact(struct contact *pc);
//删除信息
void delcontact(struct contact *pc);
//查找信息
void searchcontact(struct contact *pc);
//修改信息
void modifycontact(struct contact *pc);

在通讯录结构体中包含两部分,其一为结构体数组,储存每个人的信息,其二为一个整数,记录当前的通讯录已有的人数
重点来讲7个实现功能的函数,剩余的两个文件会在最后统一展现

二、初始化通讯录

void initcontact(struct contact*pc)
{
	pc->sz = 0;
	//memset--设置内存的函数
	memset(pc->data, 0, sizeof(pc->data));//将结构体数组初始化为0
}

memset函数将结构体数组初始化为0

void *memset( void *dest, int c, size_t count );

三、添加通讯录信息

void addcontact(struct contact *pc)
{
	if (pc->sz == MAX)
		printf("通讯录已满,无法添加\n");
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入电话号码:>");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[pc->sz].addr);

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

}

四、展示通讯录信息

//打印信息
void showcontact(struct contact *pc)
{
	int i = 0;
	printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n","名字","年龄","性别","电话","住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-15s\t%-5d\t%-5s\t%-12s\t%-20s\n", 
			pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);
	}	
}

五、删除信息

//找到名字并返回对应的下标
int findname(struct contact *pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
			return i;
	}
	return - 1;
}
//删除信息
void delcontact(struct contact *pc)
{
	char name[namemax] = {0};
	if (pc->sz == 0)
		printf("通讯录为空,无法删除\n");
	else
	{
		printf("请输入删除人的名字:>");
		scanf("%s", name);
		int pos=findname(pc, name);
		if (pos == -1)
			printf("要删除的人不存在");
		else
		{
			int j = 0;
			for (j = pos; j < pc->sz - 1; j++)
			{
				pc->data[j] = pc->data[j + 1];
			}
			pc->sz--;

		}
	}
}

在删除信息之前,先要找到该信息的位置,所以有了findname函数,为保障信息的连贯性,需要将后面的信息一个一个的提前,向前赋值即可,结构体可以整体赋值

六、查找通讯录信息

//查找信息
void searchcontact(struct contact *pc)
{
	char name[namemax] = { 0 };
	printf("所要查找的名字");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
		printf("不存在");
	else
	{
		printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");
		printf("%-15s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
	}
}

同样用findname函数 ,找到下标后打印

七、修改指定信息

//修改信息
void modifycontact(struct contact *pc)
{
	char name[namemax] = { 0 };
	printf("所要修改的名字");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
		printf("不存在");
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[ret].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[ret].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[ret].sex);
		printf("请输入电话号码:>");
		scanf("%s", pc->data[ret].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[ret].addr);

		printf("修改成功");
	}
}

用findname函数找到下标后,再次输入一次新的信息即可

八、实现主要代码

#define _CRT_SECURE_NO_WARNINGS

#include"contact.h"
//初始化通讯录
void initcontact(struct contact*pc)
{
	pc->sz = 0;
	//memset--设置内存的函数
	memset(pc->data, 0, sizeof(pc->data));//将结构体数组初始化为0
}

//增加信息
void addcontact(struct contact *pc)
{
	if (pc->sz == MAX)
		printf("通讯录已满,无法添加\n");
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入电话号码:>");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[pc->sz].addr);

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

}
//打印信息
void showcontact(struct contact *pc)
{
	int i = 0;
	printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n","名字","年龄","性别","电话","住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-15s\t%-5d\t%-5s\t%-12s\t%-20s\n", 
			pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);
	}
	
}
//找到名字并返回对应的下标
int findname(struct contact *pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
			return i;
	}
	return - 1;
}
//删除信息
void delcontact(struct contact *pc)
{
	char name[namemax] = {0};
	if (pc->sz == 0)
		printf("通讯录为空,无法删除\n");
	else
	{
		printf("请输入删除人的名字:>");
		scanf("%s", name);
		int pos=findname(pc, name);
		if (pos == -1)
			printf("要删除的人不存在");
		else
		{
			int j = 0;
			for (j = pos; j < pc->sz - 1; j++)
			{
				pc->data[j] = pc->data[j + 1];
			}
			pc->sz--;

		}
	}
}
//查找信息
void searchcontact(struct contact *pc)
{
	char name[namemax] = { 0 };
	printf("所要查找的名字");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
		printf("不存在");
	else
	{
		printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");
		printf("%-15s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
	}
}

//修改信息
void modifycontact(struct contact *pc)
{
	char name[namemax] = { 0 };
	printf("所要修改的名字");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
		printf("不存在");
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[ret].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[ret].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[ret].sex);
		printf("请输入电话号码:>");
		scanf("%s", pc->data[ret].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[ret].addr);

		printf("修改成功");
	}
}

九、实现main.c

#include"contact.h"

void menu()
{
	printf("***********  *****************\n");
	printf("*****1 add     2 del**********\n");
	printf("*****3 search  4 modify*******\n");
	printf("*****5 show  *****************\n");
	printf("*****0 exit ******************\n");
	printf("******************************\n");
}
enum option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW
};
void test()
{
	int input = 0;
	struct contact con;//创建通讯录
	initcontact(&con);//初始化
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case EXIT:
			printf("退出通讯录");
			break;
		case ADD:
			addcontact(&con);
			break;
		case DEL:
			delcontact(&con);
			break;
		case SEARCH:
			searchcontact(&con);
			break;
		case MODIFY:
			modifycontact(&con);
			break;
		case SHOW:
			showcontact(&con);
			break;
		}
	} while (input);
}


int main()
{
	test();
	return 0;
}	

一顿操作猛如虎,结果是个二百五。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include #include using namespace std; #define NULL 0 unsigned int key; //用来输入/输出文件流类 unsigned int key2; //key和key2分别是用做了电话号码和姓名的关键字 int *p; struct node //新建节点(用户姓名、地址、电话号码、指向下一个结点的指针 ) { char name[8],address[20]; char num[11]; node * next; }; typedef node* pnode; typedef node* mingzi; //声明了名字和电话两个指针 node **phone; node **nam; node *a; void hash(char num[11]) //以电话号码为关键字建立哈希函数 { int i = 3; key=(int)num[2]; while(num[i]!=NULL) { key+=(int)num[i]; i++; } key=key%20; } void hash2(char name[8]) //姓名为关键字建立哈希函数 { int i = 1; key2=(int)name[0]; while(name[i]!=NULL) { key2+=(int)name[i]; i++; } key2=key2%20; } //强制类型转换,将用户名的每一个字母的ASCLL码值相加并且除以20后的余数 node* input() //输入节点信息 ,建立结点,并将结点的next指针指空 { node *temp; temp = new node; temp->next=NULL; cout<<"输入姓名:"<>temp->name; cout<<"输入地址:"<>temp->address; cout<<"输入电话:"<>temp->num; return temp; } //对于指针类型返回的是地址 int apend() //添加节点 { node *newphone; node *newname; newphone=input(); newname=newphone; newphone->next=NULL; newname->next=NULL; hash(newphone->num); //利用哈希函数计算出对应关键字的存储地址 hash2(newname->name); newphone->next = phone[key]->next; //利用电话号码为关键字插入 phone[key]->next=newphone; //是采用链地址法,拉链法处理冲突的散列表结构 newname->next = nam[key2]->next; //利用用户名为关键字插入 nam[key2]->next=newname; return 0; } void create() //新建节点 { int i; phone=new pnode[20]; //动态创建对象数组,C++课本P188页 for(i=0;inext=NULL; } } void create2() //新建节点 { int i; nam=new mingzi[20]; for(i=0;inext=NULL; } } void list() //显示列表 { int i; node *p; for(i=0;inext; while(p) { cout<name<<'_'<address<<'_'<num<next; } } } void list2() //显示列表 { int i; node *p; for(i=0;inext; while(p) { cout<name<<'_'<address<<'_'<num<next; } } } void find(char num[11]) //在以电话号码为关键字的哈希表中查找用户信息 { hash(num); node *q=phone[key]->next; while(q!= NULL) { if(strcmp(num,q->num)==0) break; q=q->next; } if(q) cout<name<<"_" <address<<"_"<num<<endl; else cout<<"无此记录"<next; while(q!= NULL) { if(strcmp(name,q->name)==0) break; q=q->next; } if(q) cout<name<<"_" <address<<"_"<num<<endl; else cout<<"无此记录"<<endl; } void save() //保存用户信息 { int i; node *p; for(i=0;inext; while(p) { fstream iiout("out.txt", ios::out); //创建一个文件流对象:iiout iiout<name<<"_"<address<<"_"<num<next; } } } void menu() //菜单 { cout<<" 哈希表通讯录"<<endl; cout<<" 0.添加记录"<<endl; cout<<" 2.姓名散列"<<endl; cout<<" 3.查找记录"<<endl; cout<<" 4.号码散列"<<endl; cout<<" 5.清空记录"<<endl; cout<<" 6.保存记录"<<endl; cout<<" 7.退出系统"<>sel; if(sel==3) { cout<<"8姓名查询" <<endl;cout<<"9号码查询"<>b; if(b==9) {cout<<"请输入电话号码:"<>num; cout<<"输出查找的信息:"<<endl; find(num); } else {cout<<"请输入姓名:"<>name; cout<<"输出查找的信息:"<<endl; find2(name);}} if(sel==2) {cout<<"姓名散列结果:"<<endl; list2();} if(sel==0) {cout<<"请输入要添加的内容:"<<endl; apend();} if(sel==4) {cout<<"号码散列结果:"<<endl; list(); } if(sel==5) {cout<<"列表已清空:"<<endl; create();create2();} if(sel==6) { cout<<"通信录已保存:"<<endl; save();} if(sel==7) return 0; } return 0; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值