顺序表的应用之通讯录

news2024/11/17 2:29:51

学习了顺序表之后,我们也得知道它的实际用途吧!所以,我们今天来学习一下通讯录的实现。

typedef struct personInfo SLDataType;

 contact.h

#define NAME_MAX 20
#define GENDER_MAX 20
#define GTEL_MAX 20
#define ADDR_MAX 100
#include"SeqList.h"

//定义联系人数据结构
//姓名 性别 年龄 电话 地址
typedef struct PersonInfo
{
   char[NAME_MAX];
   gender[GENDER_MAX];
   int age;
   char tel[TEL_MAX];
   char addr[ADDR_MAX];
   
}peoInfo;
//通讯录的初始化
typedef struct SeqList Contact;//改通讯录的名字,没有包含顺序表的头文件,所以需要写出完整的名字
void ContactInit(Contact*con);
//通讯录的销毁
void ContactDestory(Contact*con);
//往通讯录里添加数据
void ContactAdd(Contact*con);
//通讯录的修改
void ContactModify(Contact*con);
//通讯录的查找
void ContactFind(Contact*con);
//通讯录的展示
void ContactShow(Contact*con);

typedef int SLDataType;

//通讯录增加删除数据

SeqList.h

#include"Contact.h"//把头文件加载进来
//typedef int SLDataType
typedef peoInfo SLDataType
{
   
  

contact.c

#include"Contact.h"
//通讯录的初始化
void ContactInit(Contact* con)
{
     //实际上要进行的是顺序表的初始化,顺序表的初始化实际上已经实现好了
     SLInit(con);
}
void ContactDestroy(Contact* con)
{
     SLDestroy(con);
}
//通讯录添加数据
void ContactAdd(contact* con)
{
   peoInfo info;
  //获取用户输入的内容:姓名,性别,年龄,电话,地址
  printf("请输入要添加的联系人姓名:\n”);
  scanf("%s",info.name);
  printf("请输入要添加的联系人性别:\n”);
  scanf("%s",info.gender);
  printf("请输入要添加的联系人年龄:\n”);
  scanf("%s",&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(0==strcmo(con->arr[i].name,name))
        {
           //找到了
           return i;
         }
    }
    //没有找到
    return -1;
}
      
       
void ContactDel(Contact* con)
{
   //要删除的文件必须存在,才能执行删除操作
   //查找
   int find=FindByName(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->arr[i].nme,
            con->arr[i].gender,
            con->arr[i].age,
            con->arr[i].tel,
            con->arr[i].addr
            );
    }
}
     
//通讯录的修改         
void ContactModify(Contact*con)
{
//要修改的联系人数据存在
   char name[NAME_MAX];
   printf("请输入要修改的用户姓名:\n");
   scanf("%s",nmae);
   int find=FindByName(con,name);
   if(find<0)
   {
       printf("要修改的联系人数据不存在!\n");
       return;
   }
   //直接修改
   printf("请输入新的姓名:\n");
   scanf("%s",con->arr[find].name);
   printf("请输入新的性别:\n");
   scanf("%s",con->arr[find].gender);
   printf("请输入新的电话:\n");
   scanf("%s",con->arr[find].tel);
   printf("请输入新的地址:\n");
   scanf("%s",con->arr[find].addr);
   printf("修改成功!\n)";
  
}
//通讯录查找
void ContactFind(Contact* con)
{
   //姓名 性别 年龄 电话 地址
   //11    11   11  11  11
   char name[NAME_Max];
   printf("%s",name);
   int find=FindByName(con,name);
   if(find<0)
   {
       printf("要修改的联系人数据不存在!\n);
       return;
   }
   //手动调整格式
    printf("%s %s %s %s %s\n","姓名","性别","年龄","电话","地址");
    printf("%s %s %d %s %s\n",
            con->arr[find].nme,
            con->arr[find].gender,
            con->arr[find].age,
            con->arr[find].tel,
            con->arr[find].addr
            );


    

通讯录的测试方法

void ContactTest()
{
   Contact con;//创建通讯录对象,实际上就是顺序表对象,等价于SL s1
   ContactInit(&con);
}

test.c

void  menu()
{
    printf("**************************************");
    printf("****1.增加联系人       2.删除联系人*****");
    printf("****3.修改联系人       4.查找联系人*****");
    printf("*****5.展示联系人      0.退出***********");
    printf("**************************************");
}
int main()
{
    int op=-1;
    Contact con;
    ContactInit(&con);
    do{
       menu();
       printf("请选择您的操作:\n");
       scanf("%d",&op);
       switch(op)
       {
        case 1:
             ContactAdd(&con);
        case 2:
             ContactDel(&con);
        case 3:
             ContactModify(&con);
        case 4:
             ContactFind(&con);
        case 5:
             ContactShow(&con);
        case 0:
             printf("退出通讯录!\n);
             break;
        default:
            printf("输入错误,请重新输入!\n);
            break;
     }while(op!=0)
     ContactDestory(&con);
     return 0;
}

如何保证程序结束后,历史通讯录信息不会丢失:

void SaveContact(contact* con)
 {
    FILE* pf = fopen("contact.txt", "wb");
    if (pf == NULL)
   {
      perror("fopen error!\n");
      return;
    }
//将通讯录数据写⼊⽂件
    for (int i = 0; i < con->size; i++)
   {
      fwrite(con->a + i, sizeof(PeoInfo), 1, pf);
    }
    printf("通讯录数据保存成功!\n");
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

post请求爬虫入门程序

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…

复现ChatGLM-6B

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 项目代码https://github.com/THUDM/ChatGLM-6B 权重开放:…

VMware Workstation Pro 全屏模型隐藏上方命令栏

点击命令栏左侧的小图标&#xff0c;可以隐藏或固定命令栏。 如果要取消白线&#xff0c;参考&#xff1a; 虚拟机全屏后隐藏vmware菜单栏的问题

【KLEE】使用Docker安装KLEE KLEE的简单使用 KLEE的约束文件

本文架构 零、前言一、KLEE简介二、Docker安装KLEE1. 使用apt安装docker2.拉取klee镜像3.使用git 拉取klee源码4.安装klee镜像5. 运行镜像 三、试用KLEE的examples1.查看并了解待测文件examples/get_sign/get_sign.c2.KLEE进行符号测试的基本步骤编译成LLVM位码文件使用KLEE进行…

爬取微博热搜榜

需求&#xff1a; 利用python和xpath爬取微博热搜榜 步骤&#xff1a; 爬虫的步骤 获取网页数据-》分析网页数据-》提取网页数据。 1&#xff0c;首先获取微博热搜数据。 热搜主页为 https://s.weibo.com/top/summary?caterealtimehot 打开收&#xff0c;按F12获取网页源…

FebHost:墨西哥.MX域名概述

墨西哥&#xff0c;这片充满生机与历史的国度&#xff0c;以其丰富的文化传统、诱人的美食以及壮丽的自然景观吸引着世界各地的游客。从古老的阿兹特克和玛雅文明到现代都市的繁华街区&#xff0c;墨西哥为每一位访客和当地居民提供了一场视觉与感官的盛宴。 关于 .MX 域名 作…

特征值与特征向量的关系,Au=λu

特征值与特征向量的关系在线性代数中是一个核心概念&#xff0c;尤其在处理矩阵和线性变换时。给定一个矩阵 A A A&#xff0c;如果存在一个非零向量 u u u和一个标量 λ \lambda λ&#xff0c;使得 A u λ u Au \lambda u Auλu&#xff0c;那么我们就说 λ \lambda λ是矩…

docker使用arthas基本教程

供参考也是自己的笔记 docker容器下使用遇到的问题&#xff1a;大致是连接不上1号进程 我这边主要的问题是用户权限问题&#xff0c;docker容器使用aaa用户启动&#xff0c;那个在docker容器内&#xff0c;需要使用aaa用于启动 docker 容器如何使用arthas #实现下载好arthas …

【LeetCode】--- 动态规划 集训(二)

目录 一、63. 不同路径 II1.1 题目解析1.2 状态转移方程1.3 解题代码 二、931. 下降路径最小和2.1 题目解析2.2 状态转移方程2.3 解题代码三、174. 地下城游戏3.1 题目解析3.2 状态转移方程3.3 解题代码 一、63. 不同路径 II 题目地址&#xff1a; 不同路径 II 一个机器人位于…

2024年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题是由安全生产模拟考试一点通提供&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材&#xff0c;N1叉车司机大纲整理而成&#xff08;含2024年…

『VUE』13. Class绑定(详细图文注释)

目录 动态和静态类结合采用数组的方式引入数组语法的动态类名代码演示总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 首先样式类定义 <style> .active {font-size: 50px; } .text-danger {color: red; } </style&g…

一文带你理解完Git知识点

文章目录 Git基础概念Git基本操作**0. 初始化仓库****1. add到暂存区****2. 再commit到本地仓库****3. 推送到远程仓库****4. 拉取远程仓库****5. 撤销更改** Git分支管理1. 创建分支命令2. 切换分支命令3. 摘取提交4. 删除分支命令5. 合并分支命令6. 变基 Git进阶1. **git tag…

计算机网络 实验指导 实验8

三层交换机的访问控制 1.实验拓扑图&#xff1a; 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1 2.实验目的…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

PPT在线压缩工具推荐

有时候使用邮箱发送邮件时&#xff0c;添加的PPT、Word、PDF文档总会因为过大而转为其他类型的附件发送&#xff0c;不仅上传缓慢&#xff0c;对方查收下载时还有有效期限制&#xff0c;7天或15天后就过期再也无法下载了&#xff0c;有没有什么办法可以压缩PPT等文档&#xff0…

基于单片机光伏太阳能跟踪系统设计

**单片机设计介绍&#xff0c;基于单片机光伏太阳能跟踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机光伏太阳能跟踪系统的设计&#xff0c;旨在通过单片机技术实现对光伏太阳能设备的自动跟踪&#xff0c;以提高太阳…

五款户外运动耳机推荐,让你畅享户外运动时光

在繁忙的都市生活中&#xff0c;我们常常被各种琐事所困扰&#xff0c;以至于忘记了自然的美丽与宁静。然而&#xff0c;当我们走近大自然&#xff0c;放下心中的烦恼&#xff0c;我们会发现&#xff0c;自然是我们最好的治愈师。热爱自然的朋友们&#xff0c;这里有一份运动耳…

linux进阶篇:磁盘管理(一):LVM逻辑卷基本概念及LVM的工作原理

Linux磁盘管理(一)&#xff1a;LVM逻辑卷基本概念及LVM的工作原理 一、传统的磁盘管理 在传统的磁盘管理方案中&#xff0c;如果我们的磁盘容量不够了&#xff0c;那这个时候应该要加一块硬盘&#xff0c;但是新增加的硬盘是作为独立的文件系统存在的&#xff0c;原有的文件系…

怎么根据ip地址计算子网掩码

在计算机网络的世界中&#xff0c;IP地址和子网掩码扮演着至关重要的角色。IP地址用于标识网络中的每一台设备&#xff0c;而子网掩码则用于区分网络地址和主机地址&#xff0c;进而确定设备在网络中的具体位置。然而&#xff0c;有时我们可能需要根据已知的IP地址来计算子网掩…

A Novel Distributed File System Using Blockchain Metadata——论文泛读

Wireless Personal Communications 2023 Paper 分布式元数据论文阅读笔记整理 问题 随着来自不同来源&#xff08;如在线社交媒体、物联网、移动数据、传感器数据、黑匣子数据等&#xff09;的大量数据以指数级的速度增长&#xff0c;集群计算已成为数据处理中不可避免的一部…