PTA 数据结构与算法 7-15 QQ帐户的申请与登陆

    xiaoxiao2025-05-05  11

    如有不对,不吝赐教 下面进入正题: 实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。

    输入格式:

    输入首先给出一个正整数N(≤10^​5​​ ),随后给出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

    这里虽然QQ号是10位数,但是还是可以用int型数据来存储。密码就莫得什么办法了,只能使用char数组来存。

    struct QQTree{ int number; char password[17]; struct QQTree *left; struct QQTree *right; };

    整个的数据我们使用Hash表来存,解决Hash冲突的数据结构是二叉树。Hash函数则是直接取余。

    下面上代码:

    #include<stdio.h> #include<malloc.h> #include<string.h> struct QQTree{ int number; char password[17]; struct QQTree *left; struct QQTree *right; }; struct QQTree *root[1<<18]; int Hash(int key); void Applicate(int number); void Login(int number); int main(void) { int N,i; int number; char command; scanf("%d",&N); for(i=0;i<N;i++){ scanf("%c",&command); scanf("%c",&command); scanf("%d",&number); switch (command){ case 'N': Applicate(number); break; case 'L': Login(number); break; } } return 0; } int Hash(int key) { key=key&((1<<18)-1); //落入散列区间 return key; } void Applicate(int number) { int key=Hash(number); //对应的键值 struct QQTree *cur=root[key]; //找到对应哈希桶 struct QQTree *newOne; newOne=(struct QQTree *)malloc(sizeof(struct QQTree)); newOne->left=newOne->right=NULL; newOne->number=number; scanf("%s",newOne->password); if(!cur){ root[key]=newOne; printf("New: OK\n"); return ; } //该哈希桶原本为空 while(1){ while(cur->number<newOne->number&&cur->right) cur=cur->right; if(cur->number<newOne->number){ cur->right=newOne; break; } //停在右孩子节点为NULL的位置 while(cur->number>newOne->number&&cur->left) cur=cur->left; if(cur->number>newOne->number){ cur->left=newOne; break; } if(cur->number==newOne->number){ printf("ERROR: Exist\n"); free(newOne); return ; } //如果树上面有相同的账号 那么肯定已经申请过 } //找到树上面的位置 printf("New: OK\n"); return ; } void Login(int number) { int key=Hash(number); struct QQTree *cur=root[key]; char password[17]; scanf("%s",password); while(cur&&cur->number!=number){ while(cur&&cur->number<number) cur=cur->right; while(cur&&cur->number>number) cur=cur->left; } if(cur){ if(!strcmp(cur->password,password)) printf("Login: OK\n"); else printf("ERROR: Wrong PW\n"); } else printf("ERROR: Not Exist\n"); return ; }

    效果:

    最新回复(0)