当前位置: 代码迷 >> 综合 >> (c语言)Hashing - Hard Version (30分)(拓扑排序+哈希表)
  详细解决方案

(c语言)Hashing - Hard Version (30分)(拓扑排序+哈希表)

热度:83   发布时间:2023-11-17 20:52:31.0

文章目录

    • 专栏题解
    • 原题题目
    • 测试数据
    • 闲谈
    • 思路
    • 代码实现
    • 结束语

专栏题解

浙大数据结构C语言 错不在我的全题解


原题题目

在这里插入图片描述




测试数据

在这里插入图片描述




闲谈

今天晚上遇到了一些事情
导致这道题思考特别缓慢
可能是 最近 春天是不是快到来了
运气比较好hhh 但是这不能阻挡我 在前往编程的路上越走越快
编程的路上注定是孤独的 独行才能走得更快
我也希望大二下的暑假 能够如愿进到好公司实习吧




思路

其实现在心情比较复杂
但是还是能够讲一下大概怎么做的

还是一部分一部分来分析叭

首先我认为最棘手 也是一个比较困惑我的地方
就是对于我们的Indegree究竟怎么存储
因为我发现 Indegree只能放在一个单独的数组里面
而且如果哈希表里面的数字 和 Indegree里面的数字又是分开的
那么我们创建Indegree数组的上线必须还是要比较大的
但是如果里面没有多少元素的话 其实空间还是很浪费的

但是如果在Indegree检查入度的时候
度的数组是单独存放的 然后我们哈希表每个的头结点里面存放数据
就是当前表的那个数据 然后后面跟着的链表
就是这个头结点数据的出度是哪些
哎 现在毕竟心情有点复杂 还是直接给出代码 不懂的地方我会给出注释




代码实现

#include <stdio.h>
#include <stdlib.h>//MAXN是Indegree最大值上限
#define MAXN 100000
#define INF 99999999//这个就是哈希链表的基本结构
typedef struct list
{
    int data;struct degree *Next;
} *LNode;//哈希表
typedef struct map
{
    int size;LNode Heads;
} *HashMap;//对入度初始化
int Indegree[MAXN] = {
    0};//创造哈希表
HashMap CreateHashMap()
{
    int HashMapSize,i;HashMap H;scanf("%d",&HashMapSize);H = (HashMap)malloc(sizeof(struct map));H->size = HashMapSize;H->Heads = (LNode)malloc(sizeof(struct list) * H->size);//初始化数据for(i=0;i< H->size;i++){
    H->Heads[i].data = -1;H->Heads[i].Next = NULL;} return H;
}//解决入度数组
void FindInDegree(HashMap H)
{
    int i,temp,position,number;LNode NewNode;for(i=0;i < H->size;i++){
    scanf("%d",&temp);//忽略掉 -1if(temp > 0){
    position = temp % H->size;//如果哈希表位置不等于本来属于他的位置while(i != position){
    //创造结点就是等于 把这个霸占了原来属于他的位置//霸主的出度给记录下来NewNode = (LNode)malloc(sizeof(struct list));NewNode->data = temp;NewNode->Next = H->Heads[position].Next;H->Heads[position].Next = NewNode;//这个被霸占的数字出度+1Indegree[temp]++;position++;//如果超出当前哈希表最大数 则减去 从头开始if(position >= H->size)position -= H->size;}//找到属于他的位置 赋值即可H->Heads[position].data = temp;}}return;
}void Print(HashMap H)
{
    int count = 0,i,j,min,temp,data;//工具人指针 负责确定位置的LNode position;//为了把 -1的数字给排除掉int Visit[1000] = {
    0};for(i=0;i < H->size;i++){
    if(H->Heads[i].data < 0 && !Visit[i]){
    Visit[i] = 1;count++;}}while(count != H->size){
    min = INF;for(i=0;i < H->size;i++){
    if(!Visit[i]){
    if(!Indegree[H->Heads[i].data] && H->Heads[i].data < min){
    min = H->Heads[i].data;temp = i;}}}count++;Visit[temp] = 1;//入度-1Indegree[min]--;position = H->Heads[temp].Next;//把访问过的结点后面记录入度的链表访问一遍//并重新计算入度while(position){
    Indegree[position->data]--;position = position->Next;}if(count==H->size)printf("%d",min);elseprintf("%d ",min);}return;
}int main()
{
    int i;HashMap H;int HashMapSize;H = CreateHashMap();FindInDegree(H);Print(H);return 0;
}



结束语

人还是要做出选择的吧
做自己认为正确的事
怎么现在每个博客下面都是我对生活的哲理
变成哲理大师了
就这样吧 我把生活中的很多东西都寄托在了博客中
和一串串的代码中 也希望和大家一起
能够好好的在大学时光中 度过充实的每一天

在这里插入图片描述

  相关解决方案