当前位置: 首页 > article >正文

基于顺序表的通讯录(纯代码)

1.SeqList.h

#pragma once
#include <stdio.h>
#include<assert.h>
#include<stdlib.h>
#include "Contact.h"

#define INIT_CAPACITY 4
//动态顺序表 按需申请
typedef PI SLDatetype;
typedef struct SeqList
{
	SLDatetype* a;
	int size;//有效数据个数
	int capacity;//空间容量
}SL;
//增删查改
void SeqInit(SL* s);
void SeqDestroy(SL* s);
void SLPushBack(SL* ps, SLDatetype x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDatetype x);
void SLPopFront(SL* ps);
void SLCheckCapacity(SL* ps);
void SLInsert(SL* ps, int pose, SLDatetype x);
void SLErase(SL* ps, int pose);

2.SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include<assert.h>
//扩容
void SLCheckCapacity(SL* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		SLDatetype* tmp = (SLDatetype*)realloc(ps->a, sizeof(SLDatetype) * ps->capacity * 2);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
}
//顺序表初始化
void SeqInit(SL* ps)
{
	ps->a = (SLDatetype*)malloc(sizeof(SLDatetype) * INIT_CAPACITY);
	if (ps->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps->size = 0;
	ps->capacity = INIT_CAPACITY;
}
//顺序表销毁
void SeqDestroy(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}
//尾插
void SLPushBack(SL* ps, SLDatetype x)
{
	assert(ps);
	//扩容
	SLCheckCapacity(ps);
	ps->a[ps->size++] = x;
}
//尾删
void SLPopBack(SL* ps)
{
	//温柔检查
	/*if (ps->size == 0)
		return;*/
		//暴力检查
	assert(ps->size > 0);
	ps->size--;
}

//头插
void SLPushFront(SL* ps, SLDatetype x)
{
	assert(ps->a);
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[0] = x;
	ps->size++;
}
//中间插入
void SLInsert(SL* ps, int pose, SLDatetype x)
{
	assert(ps);
	assert(pose >= 0 && pose <= ps->size);
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pose)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[pose] = x;
	ps->size++;
}
//中间删除
void SLErase(SL* ps, int pose)
{
	assert(ps);
		assert((pose >= 0) && (pose < ps->size));
	int begin = pose + 1;
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		++begin;
	}
	ps->size--;
}


//尾删
void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size > 0);
	int begin = 1;
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		++begin;
	}
	ps->size--;
}

3.Contact.c

#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
#include"SeqList.h"
//通讯录的初始化
void ContactInit(Contact* con)
{
	//实际上要进行的是顺序表的初始化
	//顺序表的初始化已经实现好了
	SeqInit(con);
}
//通讯录的销毁
void ContactDestroy(Contact* con)
{
	SeqDestroy(con);
}
//通讯录添加数据
void ContactAdd(Contact* con)
{
	//获取用户输入的内容:姓名+性别+年龄+电话+地址
	PI info;
	printf("请输入要添加的联系人的姓名\n");
	scanf("%s", info.name);

	printf("请输入要添加的联系人的姓别\n");
	scanf("%s", info.gender);

	printf("请输入要添加的联系人的年龄\n");
	scanf("%d", &info.age);

	printf("请输入要添加的联系人的电话\n");
	scanf("%s", info.tel);

	printf("请输入要添加的联系人的住址\n");
	scanf("%s", info.addr);

	//往通讯录中添加联系人数据
	//头插尾插都可以
	SLPushBack(con, info);
}
//通过名字查找联系人
int FindName(Contact* con, char name[])
{
	for (int i = 0; i < con->size;i++)
	{
		if (0 == strcmp(con->a[i].name, name))
		{
			//找到了
			return i;
		}
	}
	//没有找到
	return -1;
}
//通讯录删除数据
void ContactDel(Contact* con)
{
	//要删除的数据必须存在才能删除
	//查找
	char name[NAME_MAX];
	printf("请输入要删除的联系人的姓名:\n");
	scanf("%s",name);
	int find = FindName(con, name);
	if (find < 0)
		{
		printf("要删除的联系人数据不存在\n");
		return;
		}
	//要删除的联系人存在----->知道了要删除的联系人对应的下标
	SLErase(con, find);
	printf("删除成功\n");
}
void ContactShow(Contact* con)
{
  //表头:姓名 性别 年龄 电话 地址
	printf("%s %s %s %s %s\n","姓名","性别","年龄","电话","地址");
	//遍历通讯录,按照格式打印每个联系人数据
	for (int i = 0; i < con->size; i++)
	{
		printf("%s %s %d %s %s\n",
			con->a[i].name,
			con->a[i].gender,
			con->a[i].age,
			con->a[i].tel,
			con->a[i].addr
		);
	}
}
//通讯录的修改
void ContactModify(Contact* con)
{
	//要修改的联系人数据存在
	char name[NAME_MAX];
	printf("请输入要删除的联系人的姓名:\n");
	scanf("%s",name);
	int find = FindName(con, name);
	if (find < 0)
	{
		printf("要删除的联系人数据不存在\n");
		return;
	}
	//直接修改
	printf("请输入新的联系人的姓名\n");
	scanf("%s", con->a[find].name);

	printf("请输入新的联系人的姓别\n");
	scanf("%s", con->a[find].gender);

	printf("请输入新的联系人的年龄\n");
	scanf("%d", &con->a[find].age);

	printf("请输入新的联系人的电话\n");
	scanf("%s", con->a[find].tel);

	printf("请输入新的联系人的住址\n");
	scanf("%s", con->a[find].addr);

	printf("修改成功\n");
}
//查找联系人
void ContactFind(Contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找的联系人的姓名:\n");
	scanf("%s", name);
	int find = FindName(con, name);
	if (find < 0)
	{
		printf("要查找的联系人数据不存在\n");
		return;
	}
	//直接打印
	printf("%s %s %d %s %s\n",
		con->a[find].name,
		con->a[find].gender,
		con->a[find].age,
		con->a[find].tel,
		con->a[find].addr
	);
}
4.Contact.h 
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
#include<string.h>
//定义联系人数据结构
//姓名 年龄 性别 电话 地址
typedef struct PersonInfo
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PI;
struct SeqList;
//给顺序表改个名字,叫通讯录
typedef struct SeqList Contact;

//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDestroy(Contact* con);
//通讯录添加数据
void ContactAdd(Contact* con);
//通讯录删除数据
void ContactDel(Contact* con);
//通讯录的修改
void ContactModify(Contact* con);
//通讯录查找
void ContactFind(Contact* con);
//通讯录数据展示
void ContactShow(Contact* con);
#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include"Contact.h"
void menu()
{
	printf("*******************************\n");
	printf("******       通讯录      ******\n");
	printf("******  1.添加   2.删除  ******\n");
	printf("******  3.查找   4.修改  ******\n");
	printf("******  5.阅览   6.清空  ******\n");
	printf("******      0.退出       ******\n");
	printf("*******************************\n");
}


//void ContactTest()
//{
//	Contact con;//创建的通讯录对象,实际上是顺序表对象,等价于SL 
//	ContactInit(&con);
//	ContactDestroy(&con);
//	ContactAdd(&con);
//}
int main(void)
{
	Contact con;
	ContactInit(&con);
	int input;
	do
	{
		menu();
		printf("请选择:--->\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			 ContactAdd(&con);     //增加
			break;
		case 2:
			ContactDel(&con);      //删除
			break;
		case 3:
			ContactFind(&con); //查找
			break;
		case 4:
			ContactModify(& con);   //修改
			break;
		case 5:
			ContactShow(&con);    //显示
			break;
		case 6:
			ContactDestroy(&con);   //销毁
			break;
		default:
			printf("选择错误");
			break;
		}
	} while (input);
	return 0;
}


http://www.kler.cn/a/322456.html

相关文章:

  • 华为刷题笔记--题目索引
  • 【模块一】kubernetes容器编排进阶实战资源对象之Configmap与Secret简介
  • 【Android】Proxyman 抓 HTTP 数据包
  • [Qt platform plugin问题] Could not load the Qt platform plugin “xcb“
  • 3. langgraph中的react agent使用 (在react agent添加系统提示)
  • 父组件提交时让各自的子组件验证表格是否填写完整
  • 「漏洞复现」誉龙视音频综合管理平台 RelMedia/FindById SQL注入漏洞
  • 【大模型-驯化】成功解决载cuda-11.8配置下搭建swift框架
  • VSCode rust文件中的api点击无法跳转问题
  • Request 原理
  • 的使用和内联函数
  • 【Spring Cloud】Spring Cloud 概述
  • 【计算机网络 - 基础问题】每日 3 题(十七)
  • 《JKTECH柔性振动盘:原理与多行业应用》东莞市江坤自动化科技有限公司
  • TOF系列—深度图滤波
  • 手搓一个Agent#Datawhale 组队学习Task3
  • Android常用C++特性之std::move
  • 【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版
  • 华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 6 撤回通知消息
  • tomcat 文件上传 (CVE-2017-12615)
  • 计算机知识科普问答--21(101-105)
  • 【FE】NPM——概述
  • 13年408计算机考研-计算机网络
  • 动态规划算法:13.简单多状态 dp 问题_打家劫舍II_C++
  • 搜索软件 Everything 的安装与使用教程
  • Vue使用Vue Router路由:通过URL传递与获取参数