通讯录(静态版本+动态版本)

通讯录静态版本

创建三个文件: contact.h 通讯录头文件 、contact.c 通讯录函数实现文件 、test.c测试文件

//contact.h 文件

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1

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

#define MAX 100
#define MAX_Name 20
#define MAX_Sex 10
#define MAX_Tele 12
#define MAX_Addr 30

typedef struct PeoInfo
{
	char name[MAX_Name];
	int age;
	char sex[MAX_Sex];
	char tele[MAX_Tele];
	char addr[MAX_Addr];
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];
	int count;
}Contact;

void InitContact(Contact* pc);
void Add(Contact* pc);
void Show(Contact* pc);
void Del(Contact* pc);
void Search(Contact* pc);
void Modify(Contact* pc);
void Sort(Contact* pc);
//test.c文件

#include"contact.h"

//静态版本
void menu()
{
	printf("*************************\n");
	printf("******1.add  2.del*******\n");
	printf("******3.search 4.modify**\n");
	printf("******5.show 6.sort******\n");
	printf("******0.exit*************\n");
	printf("*************************\n");
}
int main()
{
	int input = 0;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Add(&con);
			break;
		case 2:
			Del(&con);
			break;
		case 3:
			Search(&con);
			break;
		case 4:
			Modify(&con);
				break;
		case 5:
			Show(&con);
			break;
		case 6:
			Sort(&con);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误,请重试\n");
			break;
		}
	} while (input);
	return 0;
}
//contact.c 文件

#include"contact.h"

void InitContact(Contact* pc)
{
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

void Add(Contact* pc)
{
	assert(pc);
	if (pc->count == MAX)
	{
		printf("联系人已满,无法增加\n");
		return;
	}
	printf("请输入联系人姓名:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入联系人年龄:>");
	scanf("%d", &(pc->data[pc->count].age));
	printf("请输入联系人性别:>");
	scanf("%s" ,pc->data[pc->count].sex);
	printf("请输入联系人电话号码:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入联系人住址:>");
	scanf("%s", pc->data[pc->count].addr);
	pc->count++;
	printf("增加成功\n");
}

int Findname(Contact* pc, char* name)
{
	assert(pc);
	for (int i = 0; i < pc->count; ++i)
	{
		if (0 == strcmp(pc->data[i].name, name))
		return i;
	}
	return -1;
}
void Del(Contact* pc)
{
	assert(pc);
	if (pc->count == 0)
	{
		printf("通讯录已无联系人\n");
		return;
	}
	char name[20] = { 0 };
	printf("请输入要删除的联系人的姓名");
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (pos != -1)
	{
		printf("找到要删除的联系人\n");
		for (int j = pos; j < pc->count-1; ++j)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->count--;
		printf("删除成功\n");
	}
	else
	{
		printf("未找到要删除的联系人\n");
	}
}

void Search(Contact* pc)
{
	assert(pc);
	char name_s[20] = { 0 };
	printf("输入要查找的联系人的姓名\n");
	scanf("%s", name_s);
	int pos = Findname(pc, name_s);
	if (pos == -1)
	{
		printf("未找到联系人\n");
		return;
	}
	else
	{
		printf("找到该联系人了\n");
		printf("%-20s\t %-3s\t %-10s\t %-12s\t %-30s\n",
			"姓名", "年龄", "性别", "电话号码", "住址");
			printf("%-20s\t %-3d\t %-10s\t %-12s\t %-30s\n", pc->data[pos].name,
				pc->data[pos].age,
				pc->data[pos].sex,
				pc->data[pos].tele,
				pc->data[pos].addr);
	}
}

void Modify(Contact* pc)
{
	assert(pc);
	char name_t[12] = { 0 };
	printf("请输入你要修改的联系人的姓名");
	scanf("%s", name_t);
	int pos = Findname(pc, name_t);
	if (pos == -1)
	{
		printf("未找到要修改的联系人的姓名\n");
			return;
	}
	else
	{
		printf("找到要修改的联系人的姓名\n");
		printf("请修改信息\n");
		printf("请输入联系人姓名:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入联系人年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入联系人性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入联系人电话号码:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入联系人住址:>");
		scanf("%s", pc->data[pos].addr);
		printf("修改成功\n");
	}
}

int compare_name(const void* e1, const void* e2)
{
	assert(e1 && e2);
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}

void Sort(Contact* pc)
{
	assert(pc);
	printf("按姓名排序\n");
	qsort(pc->data, pc->count, sizeof(PeoInfo), compare_name);
	printf("排序成功\n");
}

void Show(Contact* pc)
{
	assert(pc);
	printf("%-20s\t %-3s\t %-10s\t %-12s\t %-30s\n", 
		"姓名", "年龄", "性别", "电话号码", "住址");
	for (int i = 0; i < pc->count; ++i)
	{
		printf("%-20s\t %-3d\t %-10s\t %-12s\t %-30s\n",pc->data[i].name,
														pc->data[i].age,
														pc->data[i].sex,
														pc->data[i].tele,
														pc->data[i].addr); 
	}
}

通讯录动态版本

我们最初让通讯录可以保存3个人的信息,不够的话每次增加2个,这就需要增容,用到malloc、realloc函数了。

结构体PeoInfo 不用改,Contact 里面data不能用数组了,我们改成指针,同时增加一个成员:capacity用来记录容量,当count(实际联系人个数) ==capacity时,就说明需要增容了。

函数部分需要改变的是初始化,以及增加Add函数,并最后在退出程序时执行销毁操作,释放内存,其它地方可以不改变,代码如下:

//contact.h

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1

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

#define MAX 100
#define MAX_Name 20
#define MAX_Sex 10
#define MAX_Tele 12
#define MAX_Addr 30

typedef struct PeoInfo
{
	char name[MAX_Name];
	int age;
	char sex[MAX_Sex];
	char tele[MAX_Tele];
	char addr[MAX_Addr];
}PeoInfo;

typedef struct Contact
{
	PeoInfo *data;
	int count;
	int capacity;
}Contact;

void InitContact(Contact* pc);
void Add(Contact* pc);
void Show(Contact* pc);
void Del(Contact* pc);
void Search(Contact* pc);
void Modify(Contact* pc);
void Sort(Contact* pc);
void Destory(Contact* pc);
//test.c
#include"contact.h"

//动态版本
void menu()
{
	printf("*************************\n");
	printf("******1.add  2.del*******\n");
	printf("******3.search 4.modify**\n");
	printf("******5.show 6.sort******\n");
	printf("******0.exit*************\n");
	printf("*************************\n");
}
int main()
{
	int input = 0;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Add(&con);
			break;
		case 2:
			Del(&con);
			break;
		case 3:
			Search(&con);
			break;
		case 4:
			Modify(&con);
			break;
		case 5:
			Show(&con);
			break;
		case 6:
			Sort(&con);
			break;
		case 0:
			Destory(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误,请重试\n");
			break;
		}
	} while (input);
	return 0;
}
//contact.c

#include"contact.h"

void InitContact(Contact* pc)
{
	pc->count = 0;
	pc->data = (PeoInfo*)calloc(3,sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		printf("%s\n", strerror(errno));
		return;
	}
	pc->capacity = 3;
}


CheckCapacity(Contact* pc)
{
	if (pc->count == pc->capacity)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * (3 + 2));
		if (ptr == NULL)
		{
			printf("%s\n", strerror(errno));
			return;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += 2;
			printf("增容成功\n");
		}
	}
}
void Add(Contact* pc)
{
	assert(pc);
	CheckCapacity(pc);
	printf("请输入联系人姓名:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入联系人年龄:>");
	scanf("%d", &(pc->data[pc->count].age));
	printf("请输入联系人性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入联系人电话号码:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入联系人住址:>");
	scanf("%s", pc->data[pc->count].addr);
	pc->count++;
	printf("增加成功\n");
}

int Findname(Contact* pc, char* name)
{
	assert(pc);
	for (int i = 0; i < pc->count; ++i)
	{
		if (0 == strcmp(pc->data[i].name, name))
			return i;
	}
	return -1;
}
void Del(Contact* pc)
{
	assert(pc);
	if (pc->count == 0)
	{
		printf("通讯录已无联系人\n");
		return;
	}
	char name[20] = { 0 };
	printf("请输入要删除的联系人的姓名");
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (pos != -1)
	{
		printf("找到要删除的联系人\n");
		for (int j = pos; j < pc->count - 1; ++j)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->count--;
		printf("删除成功\n");
	}
	else
	{
		printf("未找到要删除的联系人\n");
	}
}

void Search(Contact* pc)
{
	assert(pc);
	char name_s[20] = { 0 };
	printf("输入要查找的联系人的姓名\n");
	scanf("%s", name_s);
	int pos = Findname(pc, name_s);
	if (pos == -1)
	{
		printf("未找到联系人\n");
		return;
	}
	else
	{
		printf("找到该联系人了\n");
		printf("%-20s\t %-3s\t %-10s\t %-12s\t %-30s\n",
			"姓名", "年龄", "性别", "电话号码", "住址");
		printf("%-20s\t %-3d\t %-10s\t %-12s\t %-30s\n", pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}

void Modify(Contact* pc)
{
	assert(pc);
	char name_t[12] = { 0 };
	printf("请输入你要修改的联系人的姓名");
	scanf("%s", name_t);
	int pos = Findname(pc, name_t);
	if (pos == -1)
	{
		printf("未找到要修改的联系人的姓名\n");
		return;
	}
	else
	{
		printf("找到要修改的联系人的姓名\n");
		printf("请修改信息\n");
		printf("请输入联系人姓名:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入联系人年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入联系人性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入联系人电话号码:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入联系人住址:>");
		scanf("%s", pc->data[pos].addr);
		printf("修改成功\n");
	}
}

int compare_name(const void* e1, const void* e2)
{
	assert(e1 && e2);
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}

void Sort(Contact* pc)
{
	assert(pc);
	printf("按姓名排序\n");
	qsort(pc->data, pc->count, sizeof(PeoInfo), compare_name);
	printf("排序成功\n");
}

void Show(Contact* pc)
{
	assert(pc);
	printf("%-20s\t %-3s\t %-10s\t %-12s\t %-30s\n",
		"姓名", "年龄", "性别", "电话号码", "住址");
	for (int i = 0; i < pc->count; ++i)
	{
		printf("%-20s\t %-3d\t %-10s\t %-12s\t %-30s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

void Destory(Contact* pc)
{
	assert(pc);
	free(pc->data);
	pc->data = NULL;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的学生通讯录管理系统的C语言示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SIZE 100 typedef struct { char name[20]; char phone[20]; } Student; void addStudent(Student students[], int *count) { if (*count >= MAX_SIZE) { printf("通讯录已满,无法添加新的学生信息。\n"); return; } printf("请输入学生姓名:"); scanf("%s", students[*count].name); printf("请输入学生电话:"); scanf("%s", students[*count].phone); (*count)++; printf("学生信息添加成功。\n"); } void displayStudents(Student students[], int count) { if (count == 0) { printf("通讯录为空。\n"); return; } printf("学生通讯录:\n"); for (int i = 0; i < count; i++) { printf("姓名:%s,电话:%s\n", students[i].name, students[i].phone); } } void searchStudent(Student students[], int count) { if (count == 0) { printf("通讯录为空。\n"); return; } char keyword[20]; printf("请输入要查询的学生姓名或电话:"); scanf("%s", keyword); int found = 0; for (int i = 0; i < count; i++) { if (strcmp(students[i].name, keyword) == 0 || strcmp(students[i].phone, keyword) == 0) { printf("找到匹配的学生信息:姓名:%s,电话:%s\n", students[i].name, students[i].phone); found = 1; } } if (!found) { printf("未找到匹配的学生信息。\n"); } } int main() { Student students[MAX_SIZE]; int count = 0; int choice; while (1) { printf("\n学生通讯录管理系统\n"); printf("1. 添加学生信息\n"); printf("2. 显示学生信息\n"); printf("3. 查询学生信息\n"); printf("4. 退出\n"); printf("请输入操作编号:"); scanf("%d", &choice); switch (choice) { case 1: addStudent(students, &count); break; case 2: displayStudents(students, count); break; case 3: searchStudent(students, count); break; case 4: printf("感谢使用学生通讯录管理系统,再见!\n"); exit(0); default: printf("无效的操作编号,请重新输入。\n"); } } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值