PTA-06-散列查找2-QQ账号的申请与登录

实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。

输入格式:

输入首先给出一个正整数N(≤105),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。

输出格式:

针对每条指令,给出相应的信息:

1)若新申请帐户成功,则输出“New: OK”;
2)若新申请的号码已经存在,则输出“ERROR: Exist”;
3)若老帐户登陆成功,则输出“Login: OK”;
4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5)若老帐户密码错误,则输出“ERROR: Wrong PW”。

输入样例:

5
L 1234567890 myQQ@qq.com
N 1234567890 myQQ@qq.com
N 1234567890 myQQ@qq.com
L 1234567890 myQQ@qq
L 1234567890 myQQ@qq.com

输出样例:

ERROR: Not Exist
New: OK
ERROR: Exist
ERROR: Wrong PW
Login: OK
/*
本题是散列查找的一个典型的应用,关键还是处理冲突和散列函数的建立。
处理散列冲突就用分离链接法,散列函数就用除留余数法。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
typedef struct List *L;
struct List
{char code[17];//密码char user[11];//用户账号L next;
};
//定义散列表
typedef struct HashTable
{int tableSize;L *head;//定义一个记录头节点的数组
}Ha;
//获得散列表的长度,因为长度最好为素数
int nextPrime(int T);
//初始化散列表
Ha *initHashTable(int T)
{int i;Ha *H = (struct HashTable *)malloc(sizeof(struct HashTable));//方便找bug,做项目时就需要把各种情况考虑进去if(H==NULL){printf("Fail\n");return NULL;}H->tableSize = nextPrime(T);//获得散列表长度H->head=(L *)malloc(sizeof(struct List)*H->tableSize);//分配H->tableSize的内存 if(H->head==NULL){printf("Fail\n");return NULL;}for(i=0;i<H->tableSize;i++){H->head[i]=(struct List *)malloc(sizeof(struct List));//给每一个头节点分配内存空间if(H->head[i]==NULL){printf("Fail\n");return NULL;}H->head[i]->next=NULL;}return H;
}
int nextPrime(int T)
{int n = (T % 2) ? (T+2):(T+1),i;int max= 100000;//寻找比n小的且与它互质的数while(n<max){for(i=sqrt(n);i>2;i--){if(n%i==0)break;}if(i==2)break;elsen+=2;}return n;
}
//找到输入用户账号所在的位置
L locPosition(Ha *H,char user[])
{int pos;//这是头节点所在数组下标L p;pos = (atoi(user+4)%H->tableSize);//注意:这里最多去除前面4位(当然,也可以不去),因为题目中已说小马哥的QQ为1001,大于4之后就不对了,可以试试p = H->head[pos]->next;//找到头节点的位置 while(p!=NULL&&strcmp(p->user,user)!=0)//遍历头节点所在的链表,找到账号就退出p=p->next;return p;
}
//对输入数据进行账号,密码判断
void judgeUserAccount(Ha *H,char user[],char code[])
{int pos = (atoi(user+5)%H->tableSize);//判断账号是否存在L p=locPosition(H,user);if(p==NULL)//遍历了一轮都没找到,说明没有这个账号{printf("ERROR: Not Exist\n");return;}//账号存在判断密码是否正确 else{if(strcmp(p->code,code)==0){printf("Login: OK\n");return; }else{printf("ERROR: Wrong PW\n");return;}}
}
void insert(Ha *H,char user[],char code[])
{int pos = (atoi(user+4)%H->tableSize);L p = locPosition(H,user);if(p==NULL)//之前不存在这个账号,则新建一个 {L mid = (L )malloc(sizeof(struct List));if(mid==NULL)return;strcpy(mid->code,code);strcpy(mid->user,user);//头插法插入新账号,降低时间复杂度mid->next=H->head[pos]->next;H->head[pos]->next=mid;printf("New: OK\n");}else{printf("ERROR: Exist\n");}
}
int main()
{int N,i;char order;char user[11],code[17];scanf("%d",&N);Ha *H = (struct HashTable *)malloc(sizeof(struct HashTable));H=initHashTable(N);for(i=0;i<N;i++){scanf(" %c",&order);if(order=='N')//创建新的账号 {scanf("%s %s",user,code);insert(H,user,code);}else if(order=='L')//登录,需要查找账号是否存在 {scanf("%s %s",user,code);judgeUserAccount(H,user,code);}}return 0;
}

PTA-散列查找2-QQ账号的申请与登录(25分) 还在爬的小白的博客相关推荐

  1. PTA 7-15(查找) 航空公司VIP客户查询(25 分) 25分代码 哈希方法

    本来用map 写的,死活超时,看来卡不过去 只能哈希了 这里还稍微优化了一下,其实每个 哈希后的值存个 vector 来表示他的原值也行 (注: 博客作为交流使用,请勿抄袭应付作业) // #incl ...

  2. PTA 查找(散列查找)

    散列查找: 根据散列函数确定关键词key的存储位置,将key存储在一张hash哈希表内,然后根据一定的规则(线性探测,平方探测,分离链接等)来规避相同key的数据之间的冲突. 如上图,散列表的性能和装 ...

  3. PTA数据结构题目集 第十一周——散列查找

    目录 11-散列1 电话聊天狂人 (25分) 思路 代码 测试点 11-散列2 Hashing (25分) 思路 代码 测试点 11-散列3 QQ帐户的申请与登陆 (25分) 题目大意 思路 代码 测 ...

  4. 哈希表(散列查找)(c/c++)

    通过哈希表进行查找的特点是:不需要比较关键字,而是通过哈希函数计算出关键字的位置.一般来讲,为了进行高效率的查找,要求哈希函数简单均匀.空间利用率高.关键字之间的冲突少. 关于散列查找的实现需要着重考 ...

  5. 数据结构之查找算法:散列查找

    查找算法:散列查找 思维导图: 散列函数和散列表: 构造散列函数的要求: 构造散列函数的方法: 直接定址法: 除留取余法: 数字分析法: 平方取中法: 折叠法: 解决冲突的方法: 开放定址法: 线性探 ...

  6. 查找算法【哈希表】 - 散列查找及性能分析

    查找算法[哈希表] - 散列查找及性能分析 散列表虽然建立了关键字和存储位置之间的直接映像,但冲突不可避免,在散列表的查找过程中,有的关键字可以通过直接定址1次比较找到,有的关键字可能仍然需要和若干关 ...

  7. 数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法)

    数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法) /*search-hash*/ #include<math.h> #include<stdio.h> # ...

  8. “查找”学习提纲(二)——树型查找和散列查找

    文章目录 前言 代码模板 二叉排序/查找/搜索树查找 适用 性能 代码模板 折半查找和二叉排序树查找总结 平衡二叉(排序)树/AVL树 构造相应层数的树至少需要的结点数 平衡调整的过程 平衡调整的类型 ...

  9. 您已登录了一个相同的QQ账号,不能重复登录”的解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 在使用QQ聊天软件时,遇到过这样的情况,在自己电脑上登录QQ,提示"您已登录了一个相同的QQ账号,不能重复登录&qu ...

最新文章

  1. flask restful 模板
  2. 计算机视觉的前沿应用,学术报告:计算机视觉应用前沿
  3. 学Linux的你还在为正则表达式而挠头?
  4. python是高级动态编程语言-python是一种跨平台、开源、免费的高级动态编程语言,对么...
  5. 国家会展中心启动5G网络建设,推进无人驾驶等应用场景落地
  6. JZOJ 5925. 【NOIP2018模拟10.25】naive 的瓶子
  7. Python基础day05【函数应用:学生管理系统、拆包、今日总结】
  8. mysql客户库_你应该知道的10个MySQL客户启动选项
  9. 【题解】洛谷P4145 花神游历各国(线段树)
  10. 【NOIP 2017】列队
  11. javascript自定义startWith()和endWith()方法
  12. K8S_Google工作笔记0003---K8S核心概念
  13. 一篇带你完全掌握线程的博客
  14. android 打包问题,Android离线打包常见问题
  15. 小程序发布上线流程_微信小程序发布_审核上线流程及注意事项_企业服务汇
  16. 嵌入SpreadJS,赋能计量器具检定信息化
  17. excel 函数 用=引用后,筛选功能排序,结果引用位置错乱
  18. Unity HDRP室外场景打光流程分享(上篇)-UE4场景转Unity HDRP
  19. android 文字转语音(中文) TextSpeech
  20. UEditor之图片上传如何和真实项目结合

热门文章

  1. 共模电感听过很多次,但是什么原理你们真的懂吗?
  2. Linux切换到root用户
  3. 设计模式系列-装饰模式
  4. 疫情应对能力世界第五,泰国目标成为“世界医疗和健康中心” | 美通社头条...
  5. 河洛理数计算程序——配卦
  6. Codeup墓地-1133
  7. Avast 导致 VMware 虚拟机无法上网解决方法
  8. android酷管家初始密码,酷派大神要酷管家密码才能恢复出厂设置
  9. 【HanLP】eclipse/myeclipse下配置HanLP
  10. jdk1.8中,java 抽象类和接口的区别