C语言实现建立手机通讯录(顺序结构)

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

一.题目要求

今天来和大家分享一个简易通讯录(C语言实现)

首先要介绍一下通讯录的基本功能

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息

二.思路分析

1. 首先需要定义通讯录的数据结构,可以使用结构体来表示每个联系人的信息,包括姓名、电话号码、地址等。

2. 接着需要定义一个数组来存储所有联系人的信息,数组的大小可以根据实际需求进行调整。

3. 编写程序菜单,包括添加联系人、删除联系人、查找联系人、显示所有联系人等功能。

4. 在添加联系人功能中,需要让用户输入联系人的信息,并将其存储到数组中。

5. 在删除联系人功能中,需要让用户输入要删除的联系人姓名,并在数组中查找并删除该联系人的信息。

6. 在查找联系人功能中,需要让用户输入要查找的联系人姓名,并在数组中查找并显示该联系人的信息。

7. 在显示所有联系人功能中,需要遍历数组并逐个显示每个联系人的信息。

8. 最后,可以使用文件读写功能将通讯录数据保存到文件中,以便下次启动程序时可以读取之前保存的数据。

总结,考虑到数据结构中的顺序表和单链表,我们可以采用这两种结构来实现。本文选择使用顺序表来实现,下一章可以通过单链表来实现。

三.各部分功能实现

1.定义通讯录结构

  •        在声明线性表的顺序存储类型时,定义一个data数组来存储线性表中的所有元素,定义一个整型变量length来存储线性表的实际长度,并采用结构体类型SqList表示。
//定义通讯录结构表
typedef struct {
	char name[20];
	char tel[15];
} Elemtype;

//声明顺序表
typedef struct {
	Elemtype  data[MaxSize];           //存放线性表中的元素是Elemtype所指代的通讯录结构体
	int length;                        //存放线性表的长度
} SqList;                             //表示本次实验使用顺序表类型来完成通讯录的建立

2.初始化以及销毁线性表

  • 初始化线性表:该运算的功能是构造一个空的线性表L,实际上只需要分配线性表的存储空间并将 Length 域设置为0即可。
  • 销毁线性表:释放线性表L所占的内存空间。
//初始化线性表
void InitList(SqList *&L) {
	/*如果不方便理解,可以把L作为一个结构体指针,则下面操作可以理解为首先把分配的
	  一个结构体SqList一样大小的空间的首地址赋给L,L所指向的结构体中数据元素个数为0*/
	L = (SqList * )malloc(sizeof(SqList));
	L->length = 0;
}

//撤销(销毁)线性表
void DestroyList(SqList *&L) {
	free(L);                 //释放指针L指向的顺序表空间
}

3.插入数据元素

  •         该运算在顺序表L的第 i (1≤i≤n+1)个位置上插人新元素e。如果 i 值不正确,返回false;否则将顺序表原来的第i个元素及以后的元素均后移一个位置,并从最后一个元素an开始移动起。腾出一个空位置插入新元素,最后顺序表的长度增1并返回true。算法如下:
//插入数据元素
bool ListInsert(SqList *&L, int i, Elemtype e) {
	/*在顺序表L的第i个位置上插入新元素e*/
	int j;
	//参数i不正确时,返回false
	if (i < 1 || i > L->length + 1 || L->length == MaxSize)
		return false;
	i--;                //将顺序表逻辑序号转化为物理序号
	//参数i正确时,将data[i]及后面的元素后移一个位置
	for (j = L->length; j > i; j--) {
		L->data[j] = L->data[j - 1];
	}
	L->data[i] = e;      //插入元素e
	L->length++;         //顺序表长度加1
	return true;
}

4.删除数据元素

  •        该运算删除顺序表L的第 i (1≤i≤n)个元素。如果i值不正确,返回false;否则线性表第 i 个元素以后的元素均向前移动一个位置,并从元素a(i+1)开始移动起,这样覆盖了原来的第 i个元素,达到了删除该元素的目的,最后顺序表的长度减1并返回true。算法如下:
//删除数据元素
bool ListDelate (SqList *&L, int i, Elemtype &e) {
	/*删除顺序表中的第i个元素,其值为e*/
	int j;
	if (i < 1 || i > L->length)
		return false;
	i--;              //将顺序表逻辑序号转化为物理序号
	e = L->data[i];
	//参数正确时,将data[i]之后的元素前移一个位置
	for (j = i; j < L->length - 1; j++)
		L->data[j] = L->data[j + 1];
	L->length--;     //顺序表的长度减1
	return true;
}

5.输出线性表

  • 依次显示L中各元素的值
//输出线性表
void DispList(SqList *L) {
	if (L->length == 0)
		printf("线性表为空");
	//扫描顺序表,输出各元素
	for (int i = 0; i < L->length; i++) {
		printf("%s    %s", L->data[i].name, L->data[i].tel);
		printf("\n");
	}
	printf("\n");
}

6.求某个数据元素值

  • 该运算用应用型参数e返回L中第i个元素的值
//求某个数据元素值
bool GetElem(SqList *L, int i, Elemtype &e) {
	if (i < 1 || i > L->length)
		return false;         //参数i错误时,返回false
	e = L->data[i - 1];      //取元素值
	return true;
}

7.元素查找

  • 该运算顺序查找第一个值域与e相等的元素的逻辑序号(找到后返回一个大于0的值),若这样的元素不存在,则返回值为0。
//元素查找
int LocateElem(SqList *L, Elemtype e) {
	/*顺序查找第一个值域与e相等的元素逻辑序号(根据e找i)*/
	int i = 0;
	//while循环查找e
	while (i < L->length && strcmp(L->data[i].name, e.name) != 0)
		i++;
	if (i >= L->length)
		return 0;                      //未找到返回0
	else
		printf("%s   %s\n",L->data[i].name,L->data[i].tel);
		return i + 1;                 //找到后返回其逻辑序号
}

四. 完整代码

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

#define MaxSize 50

//定义通讯录结构表
typedef struct {
	char name[20];
	char tel[15];
} Elemtype;

//声明顺序表
typedef struct {
	Elemtype  data[MaxSize];           //存放线性表中的元素是Elemtype所指代的通讯录结构体
	int length;                        //存放线性表的长度
} SqList;                             //表示本次实验使用顺序表类型来完成通讯录的建立

/*我们这里可以有两种思路来完成顺序表的建立,
第一(整体创建):由数组元素a[0···n-1]创建顺序表L,即将数组a中的每个元素依次放入顺序表中,并将n赋给顺序表的长度域。
    前提是已经有一个数组存在,把它作为建立顺序表函数的参数进行传入。
第二(添加创建):先初始化一个空的顺序表,然后通过顺序表的添加元素函数进行补充,从而构建一个完整的顺序表。
 */

//初始化线性表
void InitList(SqList *&L) {
	/*如果不方便理解,可以把L作为一个结构体指针,则下面操作可以理解为首先把分配的
	  一个结构体SqList一样大小的空间的首地址赋给L,L所指向的结构体中数据元素个数为0*/
	L = (SqList * )malloc(sizeof(SqList));
	L->length = 0;
}

//撤销(销毁)线性表
void DestroyList(SqList *&L) {
	free(L);                 //释放指针L指向的顺序表空间
}

//插入数据元素
bool ListInsert(SqList *&L, int i, Elemtype e) {
	/*在顺序表L的第i个位置上插入新元素e*/
	int j;
	//参数i不正确时,返回false
	if (i < 1 || i > L->length + 1 || L->length == MaxSize)
		return false;
	i--;                //将顺序表逻辑序号转化为物理序号
	//参数i正确时,将data[i]及后面的元素后移一个位置
	for (j = L->length; j > i; j--) {
		L->data[j] = L->data[j - 1];
	}
	L->data[i] = e;      //插入元素e
	L->length++;         //顺序表长度加1
	return true;
}

//删除数据元素
bool ListDelate (SqList *&L, int i, Elemtype &e) {
	/*删除顺序表中的第i个元素,其值为e*/
	int j;
	if (i < 1 || i > L->length)
		return false;
	i--;              //将顺序表逻辑序号转化为物理序号
	e = L->data[i];
	//参数正确时,将data[i]之后的元素前移一个位置
	for (j = i; j < L->length - 1; j++)
		L->data[j] = L->data[j + 1];
	L->length--;     //顺序表的长度减1
	return true;
}

//输出线性表
void DispList(SqList *L) {
	if (L->length == 0)
		printf("线性表为空");
	//扫描顺序表,输出各元素
	for (int i = 0; i < L->length; i++) {
		printf("%s    %s", L->data[i].name, L->data[i].tel);
		printf("\n");
	}
	printf("\n");
}

//求某个数据元素值
bool GetElem(SqList *L, int i, Elemtype &e) {
	if (i < 1 || i > L->length)
		return false;         //参数i错误时,返回false
	e = L->data[i - 1];      //取元素值
	return true;
}

//元素查找
int LocateElem(SqList *L, Elemtype e) {
	/*顺序查找第一个值域与e相等的元素逻辑序号(根据e找i)*/
	int i = 0;
	//while循环查找e
	while (i < L->length && strcmp(L->data[i].name, e.name) != 0)
		i++;
	if (i >= L->length)
		return 0;                      //未找到返回0
	else
		printf("%s   %s\n",L->data[i].name,L->data[i].tel);
		return i + 1;                 //找到后返回其逻辑序号
}

//菜单实现
void menu() {
	printf("   -------------------------------\n");
	printf("   通讯录的应用:\n");
	printf("   -------------------------------\n");
	printf("      1.建立(初始化)通讯录\n");
	printf("      2.显示联系人信息\n");
	printf("      3.增加联系人信息\n");
	printf("      4.删除联系人信息\n");
	printf("      5.查找联系人信息\n");
	printf("      6.退出程序!!!\n");
	printf("   -------------------------------\n");
}

int main() {
	SqList *L;
	int flag = 1;   //定义循环体条件
	int i, j;         //存放用户输入的选项
	Elemtype a[4] = {"张三", "15671580583", "李四", "13387592396", "王五", "15994272725", "赵六", "15972200598"};
	Elemtype e;
	menu();
	printf("初始化顺序表并插入开始元素:\n");
	InitList(L);         //这时是一个空表,接下来通过插入元素函数完成初始化
	for (int i = 0; i < 4; i++)
		ListInsert(L, i + 1, a[i]);
	DispList(L);

	while (flag == 1) {
		printf("请输入你的选择:\n");
		scanf("%d", &j);
		switch (j) {
			case 1:
				printf("已经完成初始化\n");
				break;
			case 2:
				DispList(L);
				break;
			case 3:
				printf("请输入联系人姓名与电话:");
				scanf("%s   %s", e.name, e.tel);
				printf("请输入插入数据的位置:");
				scanf("%d", &i);
				printf("\n");
				ListInsert(L, i, e);
				break;
			case 4:
				printf("请输入删除数据的位置:");
				scanf("%d", &i);
				ListDelate(L, i, e);
				break;
			case 5:
				printf("请输入联系人姓名:");
				scanf("%s", &e.name);
				LocateElem(L, e);
				break;
			case 6:
				flag = 0;
				printf("退出程序\n");
				break;
		}
	}
	return 0;
}

五.实验截图

c语言手机号码怎么定义,数据结构与算法,c语言,开发语言,数据结构

补充:完整源代码在我上传的资源里有。 文章来源地址https://www.toymoban.com/news/detail-726395.html

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

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

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

相关文章

  • 简单步骤:Android studio 内容提供者 - 实现建立手机通讯录界面,读取系统联系人

    提示:本篇文章将会尽量保持精简,同时请诸位敲写代码时保持耐心,三连是最大的支持! 文章目录 前言 一、项目介绍 二、使用步骤 1.创建程序 2.添加 recyclerview-v7 库 3.放置界面控件 4.搭建界面布局 5.封装实体类 6.编写数据适配器 7.实现显示界面数据功能 8.去掉默认标题栏

    2024年02月08日
    浏览(57)
  • 手机通讯录的实现——C语言(静态版本)

    目录 一:通讯录的思想 二:通讯录的实现 1.创建文件 2.打印菜单 3.创建联系人结构体 4.初始化菜单 5.实现菜单的功能 a.增加联系人 b.删除联系人 c.查找联系人 d.修改联系人 e.打印联系人 三:总结 我们将每一位联系人的姓名,性别,年龄,电话,地址来用一个结构体保存,用

    2024年02月09日
    浏览(42)
  • 数据结构(初阶):顺序表实战通讯录

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

    2024年04月16日
    浏览(37)
  • 【数据结构】:顺序表及其通讯录应用

    1.1为什么会存在数据结构? 我们常常接触到诸如生活中的姓名、身份证、网页内的图片、视频等各种各样的信息,这些信息就是我们常说的数据。在使用这些数据时,我们发现随着数据的增加,当我们要单独寻找某一个数据时就会非常困难,就像图书馆内书籍如果没有按一定

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

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

    2024年01月23日
    浏览(57)
  • Python 用嵌套字典实现手机通讯录(详解版)

    运行结果: 运行结果: 作者:周华 创作日期:2023/9/27

    2024年02月03日
    浏览(47)
  • 通讯录实现【C语言】

    目录 前言 一、整体逻辑分析 二、实现步骤 1、创建菜单和多次操作问题 2、创建通讯录 3、初始化通讯录 4、添加联系人 5、显示联系人 6、删除指定联系人 ​7、查找指定联系人 8、修改联系人信息 9、排序联系人信息 三、全部源码 我们上期已经详细的介绍了自定义类型,本

    2024年02月11日
    浏览(59)
  • C语言---认识动态内存管理并实现一个动态通讯录:静态通讯录别来沾边

    👧个人主页:@小沈熬夜秃头中୧⍤⃝❅ 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C语言学习 🔑本章内容:动态内存管理 送给各位💌:当你的能力还驾驭不了你的目标时那你就应该沉下心来历练 记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~ 提示:以下是本篇

    2024年02月08日
    浏览(92)
  • 动态通讯录实现(C语言)

    目录 前言: 一:单个节点的设计和主逻辑  结点设计 主逻辑 二:接口实现 (1)生成一个新的结点 (2)增加信息 (3)打印信息 (4)查找  (5)删除信息 (6)修改信息 (7)排序  插入排序 快速排序 (8)已有数据读取 (9)更新数据录入 三:全部代码 contact.h(声明) contact.c(接口) test.c(主逻辑) 本

    2024年02月05日
    浏览(58)
  • C语言--通讯录的实现

    人的信息:姓名+年龄+性别+住址+电话 通讯录中可以存放100个人的信息 增加联系人 删除指定联系人 查找指定联系人 修改指定联系人 显示所有联系人的信息 test.c----测试通讯录 contact.c----通讯录的实现 contact.h----函数的声明 代码如下(示例): 代码如下(示例):

    2024年02月15日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包