這一題知識點與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; }