一个很Low的通讯录管理系统(但是能用)C/C++单链表实现

通讯录管理系统的设计

问题需求分析

在计算机还未普及之前通讯管理都是由联系人采用名片,通讯录往往采用的是笔录手工记帐的方式来操作的。现在一般的通讯录管理都是采用计算机作为工具的实用的计算机通讯录管理程序来帮助人们进行更有效的通讯录信息管理。本通讯录信息管理系统用计算机管理电子通讯录的一种计算机应用技术的创新,通讯录管理系统是典型的信息管理系统,其开发主要包括后台文件存储通信用户记录和维护,以及客户端操作应用程序的开发两个方面。要求应用程序功能完备,易使用等特点。

数据结构定义

我使用两种类型的结构体的方式存储数据, 通过链表的方式存储通讯录信息, 第一个结构是手机号码包含如下内容: 编号, 姓名, 性别, 号码, QQ, 微信号, 住址, 生日, 第二个结构体是节点, 每一个节点包含一个手机号和一个指针, 通过指针的相互连接形参链表, 也就是变成我们需要的通讯录。

系统功能详细设计

实现通讯录管理系统的基本功能,可以实现电话用户的查询,电话号码的查询,电话号码的添加及删除等功能,以方便人们的记录和通讯。
通讯者姓名查询:输入用户姓名,根据用户姓名查询对应用户具体信息。
通讯者号码查询:输入用户号码,根据号码查询对应用户具体信息。
通讯者号码查询:输入用户性别,根据性别查询对应用户具体信息。
通讯者生日查询:输入用户,根据号码查询对应用户具体信息
通讯者信息添加:输入用户具体信息,将用户具体信息存入指定文件中,便于以后的查询。
通信者信息修改:输入用户姓名或者号码,根据输入的用户信息查询指定用户信息,然后对用户的信息进行修改,修改保存后,将修改后的用户信息存入文件中。
通讯者信息删除:输入用户信息,根据用户信息查询指定用户,针对该用户从文件中,删除对应的信息。
通讯录信息显示:显示通讯录中所有的用户的具体信息,也可以指定输出某一项具体信息。
通讯者信息的保存:将所用用户信息, 存入指定文件中。
通讯者信息的加载:加载指定文件中所有用户的信息, 存入链表中。
通讯者信息的添加:添加用户到链表中指定位置。

函数关系调用图

在这里插入图片描述

设计体会

此处设计中出现的问题就是对C++文件操作的不熟悉,导致做文件操作的时候出现很多问题, 这个程序中还有很多不完善的地方, 就比如查找, 添加, 修改, 当数据非常多的时候, 如果还是采用顺序操作, 那么将会引起很大性能问题。

完整代码

#include<iostream>
#include<stdlib.h>
#include<fstream>
#include<string>
#include<conio.h>
using namespace std;
typedef struct{int id; string name, sex, number, qq, weChat, addr, birth;
}Telephone;
struct Node{Telephone tele;struct Node *next;
};
void Input(Telephone &t){//数据域的输入cout<<"请输入联系人的姓名:"<<endl;cin>>t.name;cout<<"请输入联系人的电话:"<<endl;while(true){cin>>t.number;int k = 1; if(t.number.length() != 11){k = 0;cout<<"电话号码输入有误(长度不够),请重新输入:"<<endl;}else{for(int i=0; i<11; i++){//判断号码是否为数字 if(t.number[i] < '0' || t.number[i] > '9'){k = 0;cout<<"电话号码输入有误(非数字),请重新输入:"<<endl;}}}if(k) break;cout<<"K="<<k<<endl; }cout<<"请输入联系人的性别(male或female):"<<endl;while(cin>>t.sex){if(t.sex == "男" || t.sex == "女") break;else cout<<t.sex<<"输入有误,请重新输入:"<<endl;}cout<<"请输入联系人的地址:"<<endl;cin>>t.addr;cout<<"请输入联系人QQ号:"<<endl;cin>>t.qq;cout<<"请输入联系人WeChat号:"<<endl;cin>>t.weChat;cout<<"请输入联系人生日:"<<endl;cin>>t.birth;
}
void Output(Telephone t){cout<<"id="<<t.id<<" name="<<t.name<<" sex="<<t.sex<<" addr="<<t.addr<<" qq="<<t.qq<<" wechat="<<t.weChat<<" birth="<<t.birth<<endl; 
}
int LengthLinkList(Node* L){//求表长
int len=0;Node *p=L;while(p->next){len++;p = p->next;}return len;
}
void save(Node* L){ofstream out;out.open("TelephoneList.txt", ios::out | ios::app);if (!out.is_open())return;out<<LengthLinkList(L)<<" ";for(Node *p = L->next; p != NULL; p = p->next){out<<p->tele.id<<" "<<p->tele.name<<" "<<p->tele.sex<<" "<<p->tele.number<<" "<<p->tele.qq<<" "<<p->tele.weChat<<" "<<p->tele.addr<<" "<<p->tele.birth<<" ";}out.close();
}		
Node* load(Node* L){Node *p = L, *q;ifstream in("TelephoneList.txt");string str[8];char buffer[256];if(!in.is_open()){cout<<"加载文件错误"<<endl; return NULL;} cout << "载入通讯录文件" << endl;in.getline(buffer, 100, ' ');string data = string(buffer);int sum = 0;for(int j = 0; j < data.length(); j++){sum = sum*10 + data[j] - 48;}for(int i = 0; i < sum; i++){for (int j = 0; j < 8; j++){in.getline(buffer, 100, ' ');str[j] = string(buffer);}q = new Node();q->tele.id = 0; string s = str[0];cout<<"s="<<s<<" s.length="<<s.length()<<" s[0]="<<s[0]<<endl;for(int j = 0; j < s.length(); j++){q->tele.id = q->tele.id*10 + s[j]-48;}
cout<<"tele.id="<<q->tele.id<<endl;q->tele.name = str[1];q->tele.sex = str[2];q->tele.number = str[3];q->tele.qq = str[4];q->tele.weChat = str[5];q->tele.addr = str[6];q->tele.birth = str[7];q->next = p->next;p->next = q;p = q;}in.close();return p;
}
int ID = 0;
void CreateLinkList(Node* L){//尾插法创建链表,头结点不存内容 Node *node, *p = load(L);Telephone t;int f = 1;ID = LengthLinkList(L);if(p != NULL){L = p;}while(f != 0){Input(t);t.id = ID++;node = new Node();node->tele = t;node->next = NULL;L->next = node;L = node; cout<<"输入1继续,输入0结束:"<<endl;cin>>f;}
}
void DisplayLinkList(Node* L){//浏览链表Node* p = L->next;cout<<"通讯录"<<endl; while(p != NULL){Output(p->tele);p = p->next;}
}
void findName(Node* L,string str){//按姓名Node *p=L->next;while(p != NULL){if(p->tele.name == str) Output(p->tele); p=p->next;}
}
void findSex(Node* L,string str){//按性别Node *p=L->next;while(p != NULL){if(p->tele.sex == str) Output(p->tele); p=p->next;}
}
void birthSearch(Node* L,string str){//按生日Node *p=L->next;while(p != NULL){if(p->tele.birth == str) Output(p->tele); p=p->next;}
}
void add(Node* L, int i, Telephone t){//插入元素(从0号开始计算) Node *p = L, *s;t.id = ID++;if(i >= LengthLinkList(L)){cout<<"插入位置错误"<<endl;return; }else{s = new Node();s->tele = t;for(int j = 0; j < i; j++){p = p->next;} s->next = p->next;p->next = s;}
}
void remove(Node* L, string name){//删除元素Node *p, *q; if(L == NULL){cout<<"输入错误"<<endl; return; }p = L;q = L->next;while(true){if(q->tele.name == name){p->next = q->next;delete q;break;}p = p->next;q = q->next;}
}
void update(Node* L, string name){//修改联系人信息Node *p = L->next;while(p != NULL){if(p->tele.name == name){cout<<"开始修改"<<endl; Input(p->tele);return; }p = p->next;}cout<<"没找到对应联系人"<<endl; 
}
void freeLinkList(Node* L){//释放整个链表的内存Node *p = L, *q = L;while(p != NULL){p = p->next;free(q);q = p;}
}
void menu(){//主菜单cout<<"单链表通讯录\n\n";cout<<"1.通讯录链表的建立;\n";cout<<"2.通讯者信息的插入;\n";cout<<"3.通讯者信息的查询;\n";cout<<"4.通讯者信息的修改;\n";cout<<"5.通讯者信息的删除;\n";cout<<"6.通讯者信息的保存;\n";cout<<"7.通讯者信息的输出;\n";cout<<"8.通讯者信息的载入;\n";cout<<"9.退出管理系统;\n";
}
int main(){int n;char c, k, m;string data;Telephone x;//初始化头结点 Node* L = new Node();L->next = NULL; while(1){menu();cout<<"请选择:"<<endl;cin>>k;system("cls");switch(k){case '1':CreateLinkList(L);cout<<"创建成功"<<endl;system("cls");break;case '2':Input(x);cout<<"输入要插入的位置"<<endl;cin>>n; add(L, n, x);DisplayLinkList(L);cout<<"输入任意键继续";cin>>m;system("cls");break;case '3':while(1){cout<<"1.按姓名查询\n2.按性别查询\n3.按生日查询\n4.返回主菜单\n请输入相应的序号进行选择:"<<endl; cin>>c; system("cls");switch(c){case '1':cout<<"请输入所要找查联系人的姓名:"<<endl; cin>>data; findName(L, data);cout<<"输入任意键继续";cin>>m;system("cls");break;case '2':cout<<"请输入所要找查联系人的性别:"<<endl; cin>>data; findName(L, data);cout<<"输入任意键继续";cin>>m;system("cls");break;case '3':cout<<"请输入所要找查联系人的生日:"<<endl; cin>>data; findName(L, data);cout<<"输入任意键继续";cin>>m;system("cls");break;case '4':goto loopOut;break;default:printf("输入错误!\n");system("cls");break;}}loopOut:system("cls");break;case '4':cout<<"请输入所要修改联系人的姓名:"<<endl;cin>>data; update(L, data);system("cls");break;case '5':cout<<"请输入所要删除联系人的姓名:"<<endl;cin>>data; remove(L, data);DisplayLinkList(L);cout<<"输入任意键继续";cin>>m;system("cls");break;case '6':save(L);system("cls");case '7':DisplayLinkList( L);cout<<"输入任意键继续";cin>>m;system("cls");break;case '8':load(L);ID = LengthLinkList(L);cout<<"输入任意键继续";cin>>m;system("cls");break;case '9':freeLinkList(L);exit(-1);default:printf("输入错误!");system("cls");}}return 0;
}

上面有错, 还请指出, 如果认为我写的还不错, 还请点个赞, 多多支持一下, O(∩_∩)O~~

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

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

相关文章

2017《面向对象程序设计》课程作业三

作业链接github链接 对于文件读写和多参数主函数学习过程中遇到的问题 这次文件读写改用了C的形式&#xff0c;然后总体还算顺利&#xff0c;借鉴了林燊的&#xff0c;因为他写的代码最容易看懂&#xff1b;还有就是借鉴了《C程序设计》&#xff0c;讲真&#xff0c;谭浩强的还…

华为不做黑寡妇,开源编译器,与友商共建安卓性能

&#xff11;今天我的一个老哥开了头条号&#xff0c;第一次发文章&#xff0c;我觉得不错&#xff0c;拿来用用&#xff0c;给大家看看华为技术总工的文采。这位总工潜伏在我的微信群里很少说话&#xff0c;大家一定要有这个想法&#xff0c;就是最低调的那个人&#xff0c;真…

点击链接如何直接跳转到相对应的聊天窗口

解决这个问题的步骤如下&#xff1a; <a target"_blank" href"http://wpa.qq.com/msgrd?v3&uin3237465337&siteqq&menuyes">一、登陆腾讯官方网站&#xff1a;http://wp.qq.com/ 二、登陆之后&#xff0c;点“设置”&#xff0c;按下图…

哈夫曼树编码与译码(完整C/C++实现代码)

哈夫曼编码的设计与应用 问题需求分析 用哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式&#xff0c;哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法&#xff0c;该方法完全依据字符出现概率来构造异字头的平均长…

移动应用开发实例_物联网改变移动应用开发的4种方式

图片来源&#xff1a;pixabay.com来源&#xff1a;物联之家网(iothome.com)转载请注明来源&#xff01;物联网改变了移动应用程序的开发格局。那么&#xff0c;为物联网开发移动应用程序有何不同&#xff1f;物联网与移动应用程序开发齐头并进。物联网改变了人类与机器的互动方…

谁都能看懂的网络模型知识

&#xff11;.网络是我们做嵌入式 避无可避的知识点&#xff0c;但是网络的层次很多&#xff0c;很多时候我们根本理解不了其中的层次和作用&#xff0c;今天跟我们公司的 X 总聊到这个&#xff0c;给我普及了一些知识&#xff0c;我觉得非常有用&#xff0c;分享给大家。最近事…

常用排序算法以及算法性能测试(完整C/C++代码实现)

排序算法性能的比较 注: 由于只是测试算法性能, 所以不会对排序算法做深入讲解, 在随后的时间将会推出排序的详细讲解 问题需求分析 排序算法经过了很长时间的演变&#xff0c;产生了很多种不同的方法。每种算法主要针对不同的数列进行排序&#xff0c;这些排序算法具有各自…

我就随便BB一下

&#xff11;.如果我开始写文章的时候&#xff0c;停顿了几分钟&#xff0c;那结果应该很明显&#xff0c;这一定是一篇比较垃圾的文章&#xff0c;没什么东西值得看&#xff0c;所以我把之前的删除了&#xff0c;重新开头来写&#xff0c;我认为&#xff0c;一个好的开头一定是…

和我一起探索嵌入式

&#xff11;.本文为微信群管理员小磊投稿作品&#xff0c;作者计划编写一系列文章&#xff0c;该篇为第一篇&#xff0c;如果有做STM32的同学这将是一个非常好的系列教程&#xff0c;欢迎关注。我15年刚建立了一个BLE的QQ群&#xff0c;很有幸认识了小磊同学&#xff0c;一个非…

Java NIO_I/O基本概念_Java中的缓冲区(Buffer)_通道(Channel)_网络I/O

I/O基本概念 缓冲区基础 缓冲区是I/O的基础, 进程使用read(), write()将数据读出/写入从缓冲区中; 当缓冲区写满, 内核向磁盘发出指令, 将缓冲区中数据写入磁盘中(这一步不需要CPU), 当磁盘控制器将缓冲区装满, 内核将缓冲区数据拷贝到进程中指定的缓冲区; 操作如下图: 当中…

跟一个大佬前辈交流了一下

&#xff11;.最近&#xff0c;跟我们公司的测试总监聊天&#xff0c;我随便问了下他几个问题&#xff0c;他也给出了答案&#xff0c;在这里随便聊下&#xff0c;希望给大家的职业生涯中有一些借鉴的作用。也能给新入职场的同学一些方向和指引。2.先介绍下这个技术总监&#x…

LINQ简记(1):基本语法

关于LINQ&#xff08;语言集成查询&#xff09;是.NET 3.5和Visual Studio 2008以上版本中引入的一种有趣的全新概念&#xff0c;语言版本有VB和C#&#xff0c;由于C#与.NET平台结合最为紧密&#xff0c;也是MS当初首推的语言&#xff0c;因此&#xff0c;本系列文章的示例代码…

我认识的一位前辈~

&#xff11;.我最近认识了一个老前辈&#xff0c;关注了我的公众号加了我的好友认识的&#xff0c;我想介绍一下这位前辈&#xff0c;不是因为他有多成功&#xff0c;也不是因为他给了我很多钱&#xff0c;我觉得他是一个在平常不过的人了&#xff0c;因为太过于平凡的思考方式…

机器学习_决策树_ID3算法_C4.5算法_CART算法及各个算法Python实现

下面的有些叙述基于我个人理解, 可能与专业书籍描述不同, 但是最终都是表达同一个意思, 如果有不同意见的小伙伴, 请在评论区留言, 我不胜感激. 参考: 周志华-机器学习 https://blog.csdn.net/xiaohukun/article/details/78112917 https://blog.csdn.net/fuqiuai/article/d…

http数据绑定spring mvc详解

转载于:https://www.cnblogs.com/panxuejun/p/6834365.html

ESP32 入门教学,不入门,不教学

&#xff11;.Internet of things &#xff08;iot&#xff09;这个概念非常火&#xff0c;物联网是什么&#xff1f;把所有物品通过射频识别等信息传感设备与互联网连接起来&#xff0c;实现智能化识别和管理。 物联网通过智能感知、识别技术与普适计算、泛在网络的融合应用&a…

一个从华为离职的朋友

1、我在之前的很多文章里面都谈到了我有一个过硬的华为朋友&#xff0c;我很少去炫耀自己有多厉害&#xff0c;认识了谁谁&#xff0c;但是我非常在意那些跟自己有过交情的朋友&#xff0c;这些朋友不是说你离开了就失去了&#xff0c;也不是你落魄了就不能吹水了&#xff0c;今…

机器学习_简单线性回归与多元回归方程原理推导_处理二值数据_最小二乘法解或梯度下降解多元回归方程(详细推导)以及Python代码实现_回归方程度量方式

下面的有些叙述基于我个人理解, 可能与专业书籍描述不同, 但是最终都是表达同一个意思, 如果有不同意见的小伙伴, 请在评论区留言, 我不胜感激. 参考: 周志华-机器学习 最小二乘法求解多元回归方程: https://blog.csdn.net/weixin_39445556/article/details/83543945 梯度下…

手写Java线程池_超详细解说_绝对能运行_代码超详细注释

线程池 问题背景 只是单纯使用 new Thread(runnable).start(); 的方式创建线程, 将会导致严重的程序性能问题: 1.线程创建, 销毁需要消耗很大的系统资源; 2.虚拟机创建线程的数量是有限的; 2.线程调度切换也将使程序性能下降; 针对这些问题, 对线程数量进行管理, 有效地重复利…

分享一个非常 nice 的工具

最近有个问题&#xff0c;我需要经常使用远程连接工具&#xff0c;原因很简单&#xff0c;我需要控制另外一台电脑&#xff0c;我刚开始使用的是 teamviewer 这个软件&#xff0c;刚开始用的时间是非常爽的&#xff0c;不过有一天他给我来了个提示&#xff0c;说我的软件被商用…