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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM