7-15 QQ帐户的申请与登陆 (25分)
这一题知识点与7-14基本上是一样的,都是用的散列。
AC的代码:
//将QQ号的类型从数字型改为字符串型后,成功AC。 #include <iostream> #include <string> #include <cstring> using namespace std; long N; typedef struct user { char num[20]; char pass[200]; struct user* next; }node; typedef node* node_ptr; node_ptr* createtable(unsigned int size) { node_ptr* T = new node_ptr[N]; for (unsigned int i = 0; i < size; i++) { T[i] = new node; T[i]->next = NULL; } return T; } typedef unsigned long long Index; Index hash_(char* key, unsigned int tablesize) { Index hash_val = 0; while (NULL != *(key+5)) { hash_val = (hash_val << 5) + *(key++); } return hash_val % tablesize; } void apply(char* num, char* s2, node_ptr* T) { Index hash_val = hash_(num, N); node_ptr s = T[hash_val]; while (NULL != s->next) { s = s->next; if (!strcmp(s->num,num)) { cout << "ERROR: Exist" << endl; return; } } if (NULL == s->next) { node_ptr temp = new node; strcat(temp->num,num); strcpy(temp->pass, s2); temp->next = NULL; s->next = temp; cout << "New: OK" << endl; return; } } void login(char* num, char* s2, node_ptr* T) { Index hash_val = hash_(num, N); node_ptr s = T[hash_val]; while (NULL != s->next) { s = s->next; if (!strcmp(s->num , num)) { if (!strcmp(s->pass, s2)) { cout << "Login: OK" << endl; } else cout << "ERROR: Wrong PW" << endl; return; } } if (NULL == s->next) { cout << "ERROR: Not Exist" << endl; return; } } int main() { cin >> N; char s1[20]; char str2[200]; node_ptr* T = createtable(N); char order; for (unsigned int i = 0; i < N; i++) { cin >> order; if (order == 'N') { cin >> s1; cin >> str2; apply(s1, str2, T); } else if (order == 'L') { cin >> s1; cin >> str2; login(s1, str2, T); } } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步