数据结构——基于顺序表实现通讯录

这篇具有很好参考价值的文章主要介绍了数据结构——基于顺序表实现通讯录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、. 基于动态顺序表实现通讯录

1.1  功能要求

1)⾄少能够存储100个⼈的通讯信息

2)能够保存⽤⼾信息:名字、性别、年龄、电话、地址等
3)增加联系⼈信息
4)删除指定联系⼈
5)查找制定联系⼈
6)修改指定联系⼈
7)显⽰联系⼈信息

1.2   思路分析

我们之前创建的顺序表可以实现连续存储数据(类型可以为整型、字符等),但无论是哪种类型,存储信息都比较单一,但是通讯录存储信息比较多,有联系人姓名、性别、年龄等,所以我们把一个联系人的所有信息作为一个整体存储到顺序表,原来我们写的是整型作为数据存储每个数组元素空间,现在转化通讯录,把一个人的所有信息打包变为结构体然后存储到数组元素元素的空间,然后基于顺序表实现通讯录功能。

数据结构——基于顺序表实现通讯录,数据结构,数据结构,c++,c语言

1.3 通讯录的实现

因为我们是基于顺序表实现通讯录,先将顺序表写好

1.3.1 顺序表

1.3.1.1  SeqList.h
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
//#include"Contact.h"
#define NAME_MAX 100
#define SEX_MAX 10
#define TEL_MAX 15
#define ADDR_AMX 20
struct ContactInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_AMX];
};
typedef struct ContactInfo  SLDateType;
typedef struct SeqList
{
	SLDateType* a;
	int size;//空间有效数据
	int capacity;//空间大小
}SL;

//初始化和销毁
void SLInit(SL* ps);
void SLDestory(SL* ps);

//尾插和头插
void SLPushBack(SL* ps, SLDateType x);
void SLPushFront(SL* ps, SLDateType x);
//void SLPrint(SL* ps);

//头删和尾删
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);

//在指定位置之前插入
void SLInsert(SL* ps, int pos, SLDateType x);
//删除指定位置
void SLDel(SL* ps, int pos);

注:这里值得注意的是我们将通讯信息结构体定义在SeqList.h中,然后重命名,后面的顺序表结构也是这样,那为什么不把通讯信息结构体定义在Contact.h,然后再SeqList.h中包含Contact.h,对typedef struct ContactInfo  SLDateType

这样看似没问题,实际会造成重命名的问题,所以我们字书时要规范。

数据结构——基于顺序表实现通讯录,数据结构,数据结构,c++,c语言

数据结构——基于顺序表实现通讯录,数据结构,数据结构,c++,c语言

输出结果:

数据结构——基于顺序表实现通讯录,数据结构,数据结构,c++,c语言

1.3.1.2  SeqList.c
#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
void SLInit(SL* ps)
{
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}
void SLDestory(SL* ps)
{
	if (ps->a)
		free(ps->a);
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}
int  SLCheckCapacity(SL* ps)
{
	assert(ps);
	int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
	if (ps->size == ps->capacity)//进行扩容
	{
		SLDateType* ret = (SLDateType*)realloc(ps->a, newcapacity * sizeof(SLDateType));
		if (ret == NULL)
		{
			perror("realloc fail:");
			return 1;
		}
		ps->a = ret;
		ps->capacity = newcapacity;
	}
}

void SLPushBack(SL* ps, SLDateType x)//1.若空间足够,进行插入  2.若空间不够,进行扩容(以1.5或2倍原来大小进行扩容)
{
	assert(ps);
	SLCheckCapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;
}
//void SLPrint(SL* ps)
//{
//	assert(ps);
//	for (size_t i = 0; i < ps->size; i++)
//	{
//		printf("%d ", ps->a[i]);
//	}
//	printf("\n");
//}
void SLPushFront(SL* ps, SLDateType x)
{
	assert(ps);
	SLCheckCapacity(ps);

	for (size_t i = ps->size; i > 0; i--)
	{
		ps->a[i] = ps->a[i-1];
	}
	ps->a[0] = x;
	ps->size++;
}


bool SLIsEmpty(SL * ps)//若返回值为假,则有数据,反之,则无
{
	assert(ps);
	return ps->size == 0;
}
void SLPopBack(SL* ps)
{
	assert(ps);
	//还需要判断是否有数据
	assert(!SLIsEmpty(ps));
	ps->size--;
}
void SLPopFront(SL* ps)
{
	assert(ps);
	//还需要判断是否有数据
	assert(!SLIsEmpty(ps));
	for (size_t i = 0; i < ps->size-1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}



// 在指定位置之前插入
void SLInsert(SL* ps, int pos, SLDateType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	//防止越界访问
	

	assert(pos>= 0 && pos<= ps->size);//端点位置为头插和尾插
	for (size_t i = ps->size; i >pos; i--)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[pos] = x;
	ps->size++;
}
//删除指定位置
void SLDel(SL* ps, int pos)
{
	assert(ps);
	assert(!SLIsEmpty(ps));
	
	assert(pos>= 0 && pos< ps->size);//端点位置为头删和尾删
	for (size_t i = pos; i < ps->size-1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

1.3.2  通讯录的初始化+销毁

1.3.2.1 Contact.h
#define _CRT_SECURE_NO_WARNINGS


typedef  struct ContactInfo CInfo;
typedef struct SeqList Contact;//将顺序表重命名为通讯录(这里只是声明,无需包含Seqlist.h)

//通讯录的初始化和销毁
void ContactInit(Contact* con);
void ContactDestroy(Contact* con);

注:这里没有包含SeqList.h,为什么可以重定义结构体和顺序表呢?

因为这里我们只是声明,没有使用,当在text.c使用时,它就会将Contact.h的CInfo和Contact

展开。

 1.3.2.2 Contact.c
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
#include"SeqList.h"
#include <stdlib.h>
#include<stdio.h>
#include<assert.h>
void ContactInit(Contact* con)
{
	SLInit(con);
}
void ContactDestroy(Contact* con)
{
	SLDestory(con);
}

这里直接借用顺序表实现

1.3.3   通讯录的添加+删除

1.3.3.1 Contact.h
//通讯录的初始化和销毁
void ContactInit(Contact* con);
void ContactDestroy(Contact* con);
1.3.3.2 Contact.c
void ContactAdd(Contact* con)
{
	assert(con);
	 CInfo info;
	    printf("请输入姓名:\n");
		scanf("%s", info.name);
		printf("请输入性别:\n");
		scanf("%s", info.sex);
		printf("请输入年龄:\n");
		scanf("%d", &info.age);
		printf("请输入电话号码:\n");
		scanf("%s", info.tel);
		printf("请输入地址:\n");
		scanf("%s", info.addr);
		//将数据进行尾插
		SLPushBack(con,info);

}
int FindByName(Contact* con,char name[])
{
	
	for (int i = 0; i < con->size; i++)
	{
		if (strcmp(con->a[i].name, name)==0)
		{
			return i;
		}
	}
	return -1;
}

void ContactDel(Contact* con)
{
	assert(con);
	
	char name[NAME_MAX];
	printf("需要删除的姓名:\n");
	scanf("%s", name);
	//先查找该信息位置
	int ret=FindByName(con,name);
	if (ret < 0)
	{
		printf("没找到该联系人\n");
		return 1;
	}
	SLDel(con, ret);//删除指定位置
}

注: info.name这个是数组名,所以不用取地址

1.3.4  查看通讯录 

1.3.4.1 Contact.h
//查看通讯录
void ContactShow(Contact* con);
1.3.4.2  Contact.c
void ContactShow(Contact* con)
{
	assert(con);
	assert(con->a);
	printf("%-4s%-4s%-4s%-4s%-4s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i < con->size;i++)
	{
		printf("%-4s %-4s %-4d%-4s%-4s\n",
			con->a[i].name, con->a[i].sex, con->a[i].age, con->a[i].tel, con->a[i].addr);
	}
}

1.3.5  修改通讯录

1.3.5.1 Contact.h
//修改通讯录
void ContactChange(Contact* con);
1.3.5.2 Contact.c
void ContactChange(Contact* con)
{
	assert(con);
	

	char name[NAME_MAX];
	printf("需要修改的姓名:\n");
	scanf("%s",name);
	//先查找该信息位置
	int ret = FindByName(con, name);
	if (ret < 0)
	{
		printf("没找到该联系人\n");
		return 1;
	}
	
	printf("请输入修改的姓名:\n");
	scanf("%s",con->a[ret].name);
	printf("请输入修改的性别:\n");
	scanf("%s", con->a[ret].sex);
	printf("请输入修改的年龄:\n");
	scanf("%d", &con->a[ret].age);
	printf("请输入修改的电话号码:\n");
	scanf("%s", con->a[ret].tel);
	printf("请输入修改的地址:\n");
	scanf("%s", con->a[ret].addr);
	printf("修改成功!\n");
	
}

1.3.6 查找指定联系人 

1.3.6.1 Contact.h
//查找指定联系人
void ContactFind(Contact* con);
1.3.6.2 Contact.c
void ContactFind(Contact* con)
{
	assert(con);
	char name[NAME_MAX];
	printf("需要查找的姓名:\n");
	scanf("%s", name);
	//先查找该信息位置
	int ret = FindByName(con, name);
	if (ret < 0)
	{
		printf("没找到该联系人\n");
		return 1;
	}
	printf("%-4s%-4s%-4d%-4s%-4s\n",
		con->a[ret].name, con->a[ret].sex, con->a[ret].age, con->a[ret].tel, con->a[ret].addr);
}

1.3.7 菜单界面

为方便调用通讯录的各种功能,我们做一个菜单界面

1.3.7 .1 text.c
void menu()
{ 
	printf("******************    通讯录   **********************\n");
	printf("***   1.添加联系人          2.删除联系人       ******\n");
	printf("***   3.修改通讯录          4.查看指定联系人   ******\n");
	printf("***   5.查看通讯录          0.退出通讯录       ******\n");
	printf("*****************************************************\n");

}
int main()
{
	int n = -1;
	Contact con;
	 ContactInit(&con);
	
	do
	{
		menu();
		printf("请输入你的选择;\n");
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			ContactAdd(&con);
			break;
		case 2:
			ContactDel(&con);
			break;
		case 3:
			ContactChange(&con);
			break;
		case 4:
			ContactFind(&con);
			break;
		case 5:
			ContactShow(&con);
			break;
		case 0:
			break;
		default:
			printf("输入错误,请从新输入!\n");
			break;
		}

	}while (n);
	ContactDestroy(&con);
	return 0;
}

1.3.8  测试界面

数据结构——基于顺序表实现通讯录,数据结构,数据结构,c++,c语言

数据结构——基于顺序表实现通讯录,数据结构,数据结构,c++,c语言文章来源地址https://www.toymoban.com/news/detail-743989.html

到了这里,关于数据结构——基于顺序表实现通讯录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构(初阶):顺序表实战通讯录

    数据结构(初阶)第一节:数据结构概论-CSDN博客 数据结构(初阶)第二节:顺序表-CSDN博客         本文将以C语言和顺序表实现通讯录基础管理,实现功能包括增、删、改、查等,在实现相关功能时需要用到在第二节中顺序表的相关内容,需要友友们掌握顺序表的相关

    2024年04月16日
    浏览(31)
  • 【(数据结构)—— 基于单链表实现通讯录】

    (1). 知识要求 C语言基础要求:结构体、动态内存管理、单链表、文件件操作 (2). 功能要求 1)至少能够存储100个人的通讯信息 2)能够保存用户信息:名字、性别、年龄、电话、地址等 3)增加联系人信息 4)删除指定联系人 5)查找制定联系人 6)修改指定联系人 7)显示联系

    2024年02月08日
    浏览(31)
  • 数据结构之使用顺序表写出通讯录

    昨天我们踏入了数据结构的深山,并且和顺序表battle了一番,虽说最后赢了,但同时也留下了一个问题: 如何从顺序表的增删查改加强到通讯录的的增删查改 ,别急,今天就带你一探究竟。 我们昨天实现了顺序表的头删,头插,尾删尾插,选择插入,选择删除,以及初始化

    2024年01月23日
    浏览(52)
  • C语言实现建立手机通讯录(顺序结构)

    今天来和大家分享一个简易通讯录(C语言实现) 首先要介绍一下通讯录的基本功能 添加联系人信息 删除指定联系人信息 查找指定联系人信息 修改指定联系人信息 显示所有联系人信息 总结,考虑到数据结构中的顺序表和单链表,我们可以采用这两种结构来实现。本文选择

    2024年02月07日
    浏览(37)
  • 数据结构--学生通讯录管理系统

    文章目录 一、问题描述 二、系统功能设计 三、各个代码部分 四、整体代码及其运行 五、总结 学生通讯录管理系统--C语言实现 在现实中,用学号和姓名来记录学生需要花费大量的纸质材料,并且出现容易丢失、查找困难等问题。 “学生通讯管理系统”是为了帮助老师、同

    2024年02月11日
    浏览(44)
  • python数据结构实验设计(单链表):通讯录管理

    目录 摘要 一、课程设计目的及内容 创新功能: 二、算法及设计过程分析 1.总流程 2.主界面 3.文件处理与生成单链表 4.查看所有联系人信息 5.查看人数 6.查找联系人(以姓名或号码为依据) 7.对姓名或号码输入进行模糊查找  8.添加联系人 9.删除联系人  10.合并两个通

    2024年01月16日
    浏览(29)
  • 数据结构——基于单链表实现通讯管理系统

    这个通讯录是基于单链表实现的,关于单链表,之前已经做过完整的实现方法——数据结构——单链表(C语言版) 用单链表实现的通讯录其实和用顺序表实现的通讯录类似,可以参考该文章——基于动态顺序表的应用——通讯录 完成该通讯录需要引进经过修改后的单链表的

    2024年04月14日
    浏览(52)
  • 顺序表和链表【数据结构】【基于C语言实现】【一站式速通】

    目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组  3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义  2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双向链表 双向链

    2024年01月24日
    浏览(41)
  • C++编程案例讲解-基于结构体的控制台通讯录管理系统

    添加联系人 :向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人 显示联系人 :显示通讯录中所有的联系人信息 删除联系人 :按照姓名进行删除指定联系人信息 查找联系人 :按照姓名查看指定联系人信息 修改联系人 :按照姓名重新

    2024年02月05日
    浏览(51)
  • 【数据结构】实现顺序表

    顺序表是用一段 物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下 采用数组存储 。 顺序表与通讯录类似,可以完成 增删查改 等功能。在此基础上,还可以实现 头插、头删、尾插、尾删以及某位置的插入和删除 1.创建多文件 用多文件的好处在通讯录一文

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包