问题描述

读取一组电话号码簿(由姓名和手机号码组成),将重复出现的项删除(姓名和电话号码都相同的项为重复项,只保留第一次出现的项),并对姓名相同手机号码不同的项进行如下整理:首次出现的项不作处理,第一次重复的姓名后面加英文下划线字符_和字母a,第二次重复的姓名后面加英文下划线字符_和字母b,依次类推。号码簿中姓名相同的项数最多不超过10个。最后对整理后的电话号码簿按照姓名从小到大进行排序。若输入没有指定排序算法,则只输出排序后的电话号码簿;若输入指定了快速排序算法,则按指定算法按排序键值先输出进行第一趟快速排序后的结果(即只输出姓名),然后输出排序后的电话号码簿。指定的快速排序算法如下:

辅助整型变量:
left : 当前参加排序的第一个元素在序列中的位置,初始值为0。
right: 当前参加排序的最后那个元素在序列中的位置, 初始值为n-1 。
i, j : 两个位置变量,初始值分别为left 与right+1。
选用left位置的元素作为分界元素,排序步骤:

  1. 反复执行动作i++,直到K[left]<=K[i]或者i=right。
    反复执行动作j–,直到K[left]>=K[j]或者j=left。
  2. 若i<j,则K[i]与K[j]交换位置,转到第1步。
  3. 若i>=j,则K[left]与K[j]交换位置,到此,分界元素K[s]的最终位置已经确定,然后对被K[left]分成的两部分中大小大于1的部分重复上述过程,直到排序结束。

输入形式

先从标准输入读取电话号码个数和排序算法要求(用0表示可以用任意的排序算法,1表示用指定的快速排序算法),两整数间以一个空格分隔,然后分行输入姓名和电话号码,姓名由不超过20个英文小写字母组成,电话号码由11位数字字符组成,姓名和电话号码之间以一个空格分隔,输入的姓名和电话号码项不超过100个。

输出形式

若指定了快速排序算法,则先输出第一趟快速排序后的结果:只在一行上输出第一趟排序后的姓名顺序,各姓名间以一个空格分隔。若未指定排序算法,则该行信息不输出。
无论是否指定排序算法,都要按照姓名从小到大的顺序分行输出最终的排序结果,先输出姓名再输出电话号码,中间以一个空格分隔。

样例1输入

15 0
liping 13512345678
zhaohong 13838929457
qiansan 13900223399
zhouhao 18578294857
anhai 13573948758
liping 13512345678
zhaohong 13588339922
liping 13833220099
boliang 15033778877
zhaohong 13838922222
tianyang 18987283746
sunnan 13599882764
zhaohong 13099228475
liushifeng 13874763899
caibiao 13923567890

样例1输出

anhai 13573948758
boliang 15033778877
caibiao 13923567890
liping 13512345678
liping_a 13833220099
liushifeng 13874763899
qiansan 13900223399
sunnan 13599882764
tianyang 18987283746
zhaohong 13838929457
zhaohong_a 13588339922
zhaohong_b 13838922222
zhaohong_c 13099228475
zhouhao 18578294857

样例1说明

输入了15个人名和电话号码,未指定排序算法。其中第一项和第六项完全相同,都是“liping 13512345678”,将第六项删除,第一项保留;
第八项和第一项人名相同,电话不同,则将第八项的人民整理为liping_a;同样,第二项、第七项、第十项、第十三项的人名都相同,将后面三项的人名分别整理为:zhaohong_a、zhaohong_b和zhaohong_c。
最后将整理后的电话簿按照姓名进行从小到大排序,分行输出排序结果。

样例2输入

15 1
liping 13512345678
zhaohong 13838929457
qiansan 13900223399
zhouhao 18578294857
anhai 13573948758
liping 13512345678
zhaohong 13588339922
liping 13833220099
boliang 15033778877
zhaohong 13838922222
tianyang 18987283746
sunnan 13599882764
zhaohong 13099228475
liushifeng 13874763899
caibiao 13923567890

样例2输出

anhai caibiao boliang liping zhouhao zhaohong_a liping_a qiansan zhaohong_b tianyang sunnan zhaohong_c liushifeng zhaohong
anhai 13573948758
boliang 15033778877
caibiao 13923567890
liping 13512345678
liping_a 13833220099
liushifeng 13874763899
qiansan 13900223399
sunnan 13599882764
tianyang 18987283746
zhaohong 13838929457
zhaohong_a 13588339922
zhaohong_b 13838922222
zhaohong_c 13099228475
zhouhao 18578294857

样例2说明

输入了15个人名和电话号码,指定用上述快速排序算法进行排序。对电话簿的整理与样例1完全相同。
按照指定快速排序算法对整理后的电话簿进行排序,第一趟排序的分界元素为第一个人名“liping”,第一趟结束后的顺序如上输出所示(只输出人名),最后输出排序后的结果。

代码

#include <iostream>
#include<cstring>
#include<vector>
using namespace std;struct User {string name;string pho_num;User(string na, string pho) :name(na), pho_num(pho) {};
};vector<User> CreatList(int n) {vector<User> list;list.reserve(20);vector<int> count;count.reserve(20);for (int i = 0; i < n; i++) {string name,pho_num;cin >> name >> pho_num;int count1 = 0;for (unsigned int j = 0; j < list.size(); j++) {if (name == list[j].name) {if (pho_num == list[j].pho_num) {name = ""; break;}else {count1++;}}}if (name != "") {count.push_back(count1);User* user = new User(name, pho_num);list.push_back(*user);delete(user);}}list.shrink_to_fit();count.shrink_to_fit();for (unsigned int i = 0; i < count.size(); i++) {if (count[i] != 0) {string temp = "a";temp[0] += count[i] - 1;list[i].name += "_" + temp;}}vector<int>().swap(count);return list;
}void Print_name(const vector<User> list, int n) {for (int i = 0; i <= n; i++) {cout << list[i].name<<" ";}cout <<endl;
}void Print(const vector<User> list, int n) {for (int i = 0; i < n; i++) {cout << list[i].name <<" "<< list[i].pho_num << endl;}
}void quickSort(vector<User> &list, int left, int right,int flag)
{if (left < right) {int i = left;int j = right + 1;list[left].name;while (true){while (list[++i].name < list[left].name){ if (i == right) { break;} }while (list[--j].name > list[left].name){if (j == left) { break;} }if (i >= j) break;/*����i,j��Ӧ��ֵ*/string temp = list[j].name;list[j].name = list[i].name;list[i].name = temp;temp = list[j].pho_num;list[j].pho_num = list[i].pho_num;list[i].pho_num = temp;}string temp = list[left].name;list[left].name = list[j].name;list[j].name = temp;temp = list[left].pho_num;list[left].pho_num = list[j].pho_num;list[j].pho_num = temp;if (flag == 1) Print_name(list, right);quickSort(list, left, j - 1, 0);quickSort(list, j + 1, right, 0);}
}int main()
{int n,flag;cin >> n >> flag;vector<User> list = CreatList(n);n = list.size();quickSort(list, 0, n - 1, flag);Print(list, n);vector<User>().swap(list);return 0;
}

【数据结构】通讯录整理相关推荐

  1. Python数据类型与数据结构简单整理(未完成)

    Python数据类型与数据结构简单整理 数据类型 数值型 int float 字符型 单字符 字符串 字符串前缀 格式化输出 方式一 方式二 方式三 print()函数 格式 参数介绍 参数实例 作用 ...

  2. 考研计算机874数据结构知识整理 Apare_xzc

    考研计算机874数据结构知识整理Apare_xzc for zcy勇哥 2020.11.17 一.题目类型 10道填空题 4道综合题 2道算法题(出自历年期末考试,主要考链表和二叉树) 二.综合题的考 ...

  3. java数据结构通讯录管理系统_数据结构课程设计—通讯录管理系统

    浊贤平鲁冠城美华道钉.内急顺美兴华品红缺点清屏!车组悬吊嗉囊沥胆情愿,城东兴荣规划管涌铺板?轻奏便装壳菜蓝坛卵石数据结构课程设计-通讯录管理系统.缪斯朝圣美金放下隆暑路权. 当年绸巾登封轮滑殴伤调理电 ...

  4. 数据结构通讯录查询系统

    不少人邮件问我无法运行,首先,这个需要在c++的环境下运行,虽然是用c语言写的.然后我又自己运行了一次,发现好好的,如果你无法运行,请附上报错的截图. 1 .需求分析 •          为某个单位 ...

  5. c++数据结构代码整理_抄代码对自己编程提高有用嘛

    仅作学术分享,不代表本公众号立场,侵权联系删除 知乎链接:https://www.zhihu.com/question/387940895编辑:深度学习与计算机视觉 自己刚接触数据结构,完成大作业感觉 ...

  6. 西安理工大学计算机考研数据结构863整理总结

    第一章 绪论 考试大纲 1)了解数据元素.数据结构.抽象数据类型.存储结构等概念:了解算法概念及算法设计的基本要求 : 2)掌握算法分析方法.语句的频度和估算时间复杂度.空间复杂度分析方法. 考查要点 ...

  7. 【数据结构基础整理】图--06:克鲁斯卡尔算法详解

    详解最小生成树中的克鲁斯卡尔算法 0x01.关于克鲁斯卡尔算法 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.克鲁斯卡尔算法主要针对边集数组展开. ...

  8. 数据结构——试题整理

    以下与数据的存储结构有关的术语是() A.有序表 B.线性表 C.有向图 D.顺序表 正确答案是D.顺序表 存储结构 存储结构是数据的逻辑结构用计算机语言的实现,常见的存储结构有顺序存储,链式存储,索 ...

  9. 数据结构—笔记整理—初识数据结构

    学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程. 目录 数据结构初定义 常用数据结构 这 8 种数据结构有什么区别呢? ①.数组 ②.链表 ③.栈 ④.队列 ⑤.树 ⑥.堆 ⑦.图 ⑧ ...

最新文章

  1. Microsoft Build 2016 有关微软公有云Azure
  2. Intersection of Two Linked Lists——经典问题
  3. mac安装brew和zsh
  4. 全国各地区最低工资标准情况(截至2020年3月31日)
  5. 为什么补码会比原码多一个数
  6. mysql+keepalived必须要lvs吗_Mysql双主热备+LVS+Keepalived高可用操作记录
  7. 薪资/薪水/金额的数据类型
  8. ASP.NET的IIS映射
  9. 2017.9.15 最大数maxnumber 思考记录
  10. 程序win10_只需3步!教你打造精简win10,去除系统自带程序,运行更快!
  11. python工作目录,如何使用python 3获取当前工作目录?
  12. Qt5学习笔记之bin文件合成工具四:完善功能打包程序
  13. mysql数据库去重
  14. 通俗地讲解傅立叶分析和小波分析间的关系
  15. 用cubesuite烧写器报下列错误: [Direct Error Cause] Incorrect ID Code.(C0602202)
  16. 多张图片怎么合成一个pdf文件?
  17. matlab中一个显示根号的技巧
  18. spring boot 集成redis监听Key值事件失效
  19. SRRC认证问题合集
  20. 7-26 输出大写英文字母

热门文章

  1. JIS,SHIFT-JIS,EUC-JP(日文编码简述)
  2. hdu_5151_Sit sit sit(区间DP)
  3. 在表中查找数组为x的元素
  4. 数据结构-线性表知识总结
  5. 《以客户为中心》读书笔记
  6. 2004-12-12
  7. 戴尔DELL E6530 minipcie接口扩展nvme盘,express接口装nvme盘
  8. 对于基本的捕鱼游戏设计思路(四)——序列帧动画
  9. Android中帧动画的简单实现
  10. bC技术绑定10讲③“一码双奖”的真相!