关于数据结构Mooc后的每一道答案
基本我都已经给出了详解
希望能对大家有所帮助
收藏一下也是方便大家查找吧
希望大家一起进步!

(c语言)浙大数据结构Mooc作者答案集




原题题目

在这里插入图片描述




闲谈

确实自己对atoi函数理解的不深
以至于自己检查点三一直没过
之后改了一个数据就过了
今天去上了一节课
忽然发现和自己同路一起编程的同学并不多
并没有很多人想专心搞编程
并没有很多人想大二下走实习
并没有很多人在很专心的做自己的事情

但是这也 ANYWAY
无所谓了 毕竟以后的路也是需要自己走
路上同行的人少 有的时候也能加快自己成长吧




思路

一部分一部分来分析吧
我认为重要的就是以何种方式来存储数据
其实如果把这块搞定了 这道题就差不多解出来了
剩下的就只有一些细节了 细节的地方在最后的代码实现会给注释的




如何存储数据(HashMap)

这道题其实思路和 电话狂人十分的相似
就比如电话狂人我也用的HashMap 并用的是链表的方式来储存

但这道题也需要做出一点点改变
就是对于链表的结点中需要添加一个 密码的字符串
仅此而已

#include <stdio.h>
#include <stdlib.h>//动态分配malloc
#include <string.h>//strcmp strcpy函数用到
#include <math.h>//sqrt函数

//因为有可能存在最大值为100000 保证能创造出质数出来
#define MAX 1000000
#define MAXA 10
#define MAXP 16

typedef struct list
{
	//为什么要+1呢 仔细想想 字符串是不是最后导入的时候会加个\0呢
	//如果不+1的话 这个字符穿的\0初始化会导致在外面 从而导致数字越界
    char Account[MAXA+1];
    char Password[MAXP+1];
    struct list *Next;
} *LNode;

typedef struct map
{
    int size;
    LNode Heads;
} *HashMap;


上面就是 存储方式 插入函数下面会具体给出

//创造质数
int NewPrime(int number)
{
    int i,j,temp;
    if(number==1)
        number++;
    for(i=number;i<=MAX;i++)
    {
        temp = sqrt(i);
        for(j=2;j<=temp;j++)
        {
            if(i%j==0)
                break;
        }
        if(j==temp+1)
            return i;
    }
}

//一定要注意这个地方
//为什么是+3 呢 刚开始我是跟电话狂人一样
//+MAX-5 取最后5位 那这个样子有没有想过
//账号有可能是4位数 那这个样子还能读的到账号吗
//所以只能 +3会保证至少4位账号的能读入
int Hash(char *key,int p)
{
    return(atoi(key+3) % p);
}



代码实现

注意事项上面已经给出了

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

//因为有可能存在最大值为100000 保证能创造出质数出来
#define MAX 1000000
#define MAXA 10
#define MAXP 16

typedef struct list
{
    char Account[MAXA+1];
    char Password[MAXP+1];
    struct list *Next;
} *LNode;

typedef struct map
{
    int size;
    LNode Heads;
} *HashMap;

int NewPrime(int number)
{
    int i,j,temp;
    if(number==1)
        number++;
    for(i=number;i<=MAX;i++)
    {
        temp = sqrt(i);
        for(j=2;j<=temp;j++)
        {
            if(i%j==0)
                break;
        }
        if(j==temp+1)
            return i;
    }
}

int Hash(char *key,int p)
{
    return(atoi(key+3) % p);
}

LNode Find(char *TempAccount,HashMap H)
{
    int pos = Hash(TempAccount,H->size);
    LNode position;
    position = H->Heads[pos].Next;
    if(H->Heads[pos].Next)
    while(position)
    {
        if(!strcmp(TempAccount,position->Account))
            break;
        position = position->Next;
    }
    return position;
}

void Login(HashMap H)
{
    char TempAccount[MAXA+1],TempPassword[MAXP+1];
    LNode position;
    scanf("%s %s",&TempAccount,&TempPassword);
    if(position = Find(TempAccount,H))
    {
        if(!strcmp(TempPassword,position->Password))
            printf("Login: OK\n");
        else
            printf("ERROR: Wrong PW\n");
    }
    else
        printf("ERROR: Not Exist\n");
    return;
}

void NewAccount(HashMap H)
{
    int pos;
    char TempAccount[MAXA+1],TempPassword[MAXP+1];
    LNode position,NewNode;
    scanf("%s%s",&TempAccount,&TempPassword);
    position = Find(TempAccount,H);
    if(!position)
    {
        pos = Hash(TempAccount,H->size);
        NewNode = (LNode)malloc(sizeof(struct list));
        strcpy(NewNode->Account,TempAccount);
        strcpy(NewNode->Password,TempPassword);
        NewNode->Next = H->Heads[pos].Next;
        H->Heads[pos].Next = NewNode;
        printf("New: OK\n");
    }
    else
        printf("ERROR: Exist\n");
    return;
}

HashMap CreateHashMap(int operatenumbers)
{
    int i;
    HashMap H;
    H = (HashMap)malloc(sizeof(struct map));
    H->size = NewPrime(2*operatenumbers);
    H->Heads = (LNode)malloc(sizeof(struct list) * H->size);
    for(i=0;i< H->size ;i++)
    {
        H->Heads[i].Account[0] = '\0';
        H->Heads[i].Password[0] = '\0';
        H->Heads[i].Next = NULL;
    }
    return H;
}

int main()
{
    int operatenumbers,i;
    char operation;
    HashMap H;
    scanf("%d",&operatenumbers);
    H = CreateHashMap(operatenumbers);
    for(i=0;i<operatenumbers;i++)
    {
    	//注意这里的空格 免去 空格 回车 换行符的影响
        scanf(" %c",&operation);
        switch(operation)
        {
            case 'L' : Login(H); break;
            case 'N' : NewAccount(H); break;
        }
    }
    return 0;
}



结束语

好好忙自己的 充实一点
也许这也我才能感觉得到自己的存在hhhh

在这里插入图片描述

更多推荐