顺序表的应用之通讯录

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

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");
}


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

芯课堂 | JScope虚拟示波器使用说明

​1. 首先需要安装Jlink的驱动&#xff0c;即安装JLink_Windows_V634e之后才能安装JScope&#xff0c;一般这个能正常使用Jlink下载、仿真说明你的Jlink驱动已经正常安装 2. 需要安装Jscope&#xff0c;即安装Setup_JScope_V611m&#xff0c;安装完成之后能看到以下画面 3. 新建…

ip地址电脑哪里看?一文揭秘

在数字化和网络化的今天&#xff0c;IP地址对于电脑用户而言具有至关重要的意义。无论是进行网络配置、故障排除还是安全管理&#xff0c;了解如何查看电脑的IP地址都是一项必备技能。虎观代理将深入解析IP地址的概念&#xff0c;详细指导用户如何在电脑上查看IP地址&#xff0…

红黑树插入机制深度剖析与实践指南

红黑树插入机制深度剖析与实践指南 一、红黑树的基本概念二、插入操作的初步2.1 RB-INSERT-FIXUP过程2.2 循环的不变性2.2.1 情况1&#xff1a;叔节点是红色2.2.2情况2和情况3&#xff1a;叔节点是黑色 三、插入操作的复杂性分析四、伪代码4.1 RB-INSERT 过程4.2 RB-INSERT-FIX…

angular—mooc课学习笔记

1.angular工程目录 2.设置标签元素样式 3.fex布局 4.事件绑定 5. 双向数据传输 6. 键盘实现方法

新生儿斜视:早期发现与关爱的重要性

引言&#xff1a; 新生儿斜视是一种常见的眼睛问题&#xff0c;如果不及时发现和治疗&#xff0c;可能会影响宝宝的视觉发展。因此&#xff0c;家长们需要重视并及时关注宝宝眼睛的情况&#xff0c;以便及早发现并处理斜视问题。在本文中&#xff0c;我们将探讨新生儿斜视的注意…

蓝桥杯刷题 前缀和与差分-[NewOJ P1819]推箱子(C++)

题目描述 在一个高度为H的箱子前方&#xff0c;有一个长和高为N的障碍物。 障碍物的每一列存在一个连续的缺口&#xff0c;第i列的缺口从第l各单位到第h个单位&#xff08;从底部由0开始数&#xff09;。 现在请你清理出一条高度为H的通道&#xff0c;使得箱子可以直接推出去。…

蓝桥杯刷题-09-三国游戏-贪心⭐⭐⭐

蓝桥杯2023年第十四届省赛真题-三国游戏 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i 个事件发生时会分别让 X, Y,…

GitHub突破1000星!上交、清华开源个性化联邦学习算法库PFLlib

©PaperWeekly 原创 作者 | 张剑清 单位 | 上海交通大学、清华大学&#xff08;AIR&#xff09; 研究方向 | 联邦学习 我们在 GitHub 上开源了一个个性化联邦学习算法仓库&#xff08;PFLlib&#xff09;&#xff0c;目前已经获得 1K 个 Star 和 200 个 Fork&#xff0c;在…

【C++】探索C++中的类与对象(下)---深入理解C++中的关键概念与应用

​​ &#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 在C编程中&#xff0c;有许多重要的概念和特性&#xff0c;包括构造函数、explicit关键字、静态成员、友元以及内部类…

58 vue-cli 以及 webpack 提供的默认的插件, 配置

前言 vue-cli 这边作为驱动 webpack 的一个应用 它需要构造 webpack 所需要的上下文, 以及参数 这里 我们来关注一下 vue-cli 这边为 webpack 构造的参数 的相关处理 webpack 这边上下文的配置, 主要分为了几个部分, Entry, Output, Module, Resolve, Plugin, DevServer, O…

Linux下Qt生成程序崩溃文件

文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序&#xff0c;得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时&#xff0c;假如在windows&#xff0c;当软件崩溃时&#xff0c;…

太阳能光伏电子实验酸洗用PFA方槽耐受强酸碱耐高温

PFA清洗槽是四氟清洗桶后的升级款&#xff0c;主要用于半导体光伏光电等行业&#xff0c;一体成型&#xff0c;无需担心漏液&#xff0c;表面光滑无毛刺。 别名PFA浸泡桶、PFA酸缸、PFA方槽等&#xff0c;可定制尺寸&#xff0c;可配套盖子&#xff0c;盖子有PFA/PTFE两种材质…

uniapp:聊天消息列表(好友列表+私人单聊)支持App、H5、小程序

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 文章简介&#xff08;效果图展示&#xff…

【SQL】1890. 2020年最后一次登录(简单写法;窗口函数写法)

前述 sql 中 between 的边界问题 ---- between 边界&#xff1a;闭区间&#xff0c;not between 边界&#xff1a;开区间 在 sql 中&#xff0c; between 边界&#xff1a;闭区间not between 边界&#xff1a;开区间 题目描述 leetcode题目&#xff1a;1890. 2020年最后一…

LC 235.二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&…

量身定制:选择能够解决企业问题的六西格玛培训机构

现在的培训机构太多了&#xff0c;都在打着六西格玛管理的旗号&#xff0c;甚至有很多培训机构连六西格玛管理都没有学习过&#xff0c;就敢号称自己是六西格玛管理专家。在这个鱼龙混杂的市场上&#xff0c;很多企业对于选择什么样的培训机构&#xff0c;以及如何选择一家靠谱…

【话题】如何看待那些速成并精通软件书籍的神器

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景1. 神话与现实1.1 理论与实践之间的鸿沟1.2 一劳永逸的错觉 2. 速成书籍的优势与局限2.1 优势&#xff1a;2.2 局限&#xff1a; 3. 如何有效利用速成书籍3.1 量力而…

第十二天--二维数组的彻底解刨--地址

1.二维数组我们用父子的地址来称呼二维数组的地址 比如arr[3][4] 这里的arr是二维数组的首地址&#xff0c;也是父数组的首地址&#xff0c;也是子数组的首地址 arr1父数组的地址偏移1&#xff0c;实际上是偏移了4*416个字节 arr[0]是子数组的首地址&#xff0c;arr[0]1是子数…

Ubuntu22.04安装Anaconda

一、下载安装包 下载地址&#xff1a;https://www.anaconda.com/download#Downloads 参考&#xff1a;Ubuntu下安装Anaconda的步骤&#xff08;带图&#xff09; - 知乎 下载Linux 64-Bit (x86) installer 二、安装 在当前路径下&#xff0c;执行命令&#xff1a; bash Ana…

Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066

很奇怪的问题,在使用nifi的时候碰到的,这里是用NIFI,把数据从postgresql中同步到mysql中, 首先postgresql中的源表,中是没有create_time这个字段的,但是同步的过程中报错了. 报错的内容是说,目标表中有个create_time字段,这个字段是必填的,但是传过来的flowfile文件中,的数据没…