本博文源于浙江大学《数据结构》。电话聊天狂人是非常有趣的一道题。姥姥在小白专场里从main函数搭建、重要函数编写、模块的改变与裁剪非常仔细的说明,下面就给出详细指导:
博主在前篇博文已经将散列表的基本操作实现,可查看此篇博文:
(c语言)散列表(分离链接法)基本操作集(含测试用例)

下面就给出小白专场后的完整代码:

//lt-1-1.c
//分离链接方法.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>#include<math.h>
#define KEYLENGTH 11
#define MAXTABLESIZE 100000
#define MAXD 5
typedef char ElementType[KEYLENGTH+1];
typedef int Index;
typedef struct LNode *PtrToLNode;
struct LNode {ElementType Data;PtrToLNode Next;int Count;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
typedef struct TblNode *HashTable;
struct TblNode {int TableSize;List Heads;};int NextPrime(int N)
{int i,p=(N%2)?N+2:N+1;while(p<=MAXTABLESIZE) {for(i=(int)sqrt(p);i>2;i--)if(!(p%i)) break;if(i==2) break;else p+=2;}return p;
}int Hash(int Key,int TableSize) {return Key%TableSize;
}
HashTable CreateTable(int TableSize)
{HashTable H;int i;H = (HashTable)malloc(sizeof(struct TblNode));H->TableSize = NextPrime(TableSize);H->Heads = (List)malloc(H->TableSize * sizeof(struct LNode));for(i=0;i<H->TableSize;i++){H->Heads[i].Data[0]='\0';H->Heads[i].Next = NULL;H->Heads[i].Count = 0;}return H;
}Position Find(HashTable H,ElementType Key)
{Position P;Index Pos;Pos = Hash(atoi(Key+KEYLENGTH-MAXD),H->TableSize);P = H->Heads[Pos].Next;while(P && strcmp(P->Data,Key))P = P->Next;return P;}
bool Insert(HashTable H,ElementType Key)
{Position P,NewCell;Index Pos;P = Find(H,Key);if(! P) {NewCell = (Position)malloc(sizeof(struct LNode));strcpy(NewCell->Data,Key);NewCell->Count = 1;Pos = Hash(atoi(Key+KEYLENGTH-MAXD),H->TableSize);NewCell->Next = H->Heads[Pos].Next;H->Heads[Pos].Next = NewCell;}else {P->Count ++;return false;}}void DestroyTable(HashTable H) {int i;Position P,Tmp;for(i=0;i<H->TableSize;i++) {P = H->Heads[i].Next;while(P) {Tmp = P->Next;free(P);P = Tmp;}}free(H->Heads);free(H);
}
//需要用到HashTable 的定义
//NextPrime
//CreateTable
//Hash Find
//Insert
void ScanAndOutput(HashTable H)
{int i;int MaxCnt  = 0;int PCnt = 0;ElementType MinPhone;List Ptr;MinPhone[0] = '\0';for(i=0;i<H->TableSize;i++) {Ptr = H->Heads[i].Next;while(Ptr) {if(Ptr->Count > MaxCnt) {MaxCnt = Ptr->Count;strcpy(MinPhone,Ptr->Data);PCnt = 1;}else if (Ptr->Count == MaxCnt) {PCnt ++;if(strcmp(MinPhone,Ptr->Data)>0)strcpy(MinPhone,Ptr->Data);}Ptr = Ptr->Next;}}printf("%s %d",MinPhone,MaxCnt);if(PCnt > 1) printf(" %d",PCnt);printf("\n");
}
int main()
{//创建散列表//读入号码插入表中//扫描表输出狂人;int N,i;ElementType Key;HashTable H;scanf("%d",&N);H = CreateTable(N*2);for(i=0;i<N;i++) {scanf("%s",Key); Insert(H,Key);scanf("%s",Key);Insert(H,Key);}ScanAndOutput(H);DestroyTable(H);return 0;}

(C语言详解)11-散列1 电话聊天狂人(小白实现详细解释)相关推荐

  1. 算法 散列1 电话聊天狂人

    全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案 题目:给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​), ...

  2. 11-散列1 电话聊天狂人 (25 分) (C语言)

    浙大版<C语言程序设计实验与习题指导(第3版)>题目集 11-散列1 电话聊天狂人 (25 分) 二.题解 c代码 11-散列1 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出 ...

  3. PTA 11-散列1 电话聊天狂人

    PTA 11-散列1 电话聊天狂人 文章目录 PTA 11-散列1 电话聊天狂人 思路 Code 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10^ ...

  4. 11-散列1 电话聊天狂人

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​^5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的1 ...

  5. 《数据结构》11-散列1 电话聊天狂人

    题目 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​^5​5​​ ),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨 ...

  6. 11-散列1 电话聊天狂人 (25 分)

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的 ...

  7. 11-散列1 电话聊天狂人分数 25作者 DS课程组单位 浙江大学

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字 ...

  8. 11-散列1 电话聊天狂人 (25分)

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10 ^5),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位 ...

  9. 2.8 电话聊天狂人(散列,c)

    电话聊天狂人 题意理解与解法分析 输入格式: 输出格式: 输入样例: 输出样例: 程序框架搭建 输出狂人 模板的引用与裁剪 查找 插入函数 代码 运行 原题直达:11-散列1 电话聊天狂人 题意理解与 ...

最新文章

  1. 万字谈监控:解答Zabbix与Prometheus选型疑难
  2. BAT笔试试题常见试题总结含答案(持续更新。。。)
  3. python存储和读取数据时出现错误_python读取json文件存sql及codecs读取大文件问题...
  4. MVVM模式的一个小例子
  5. 基于深度学习的手写数字识别、python实现
  6. PHP中时间戳和时区
  7. 《剑指offer》面试题18——树的子结构(C++)
  8. java找出两个共有,Java-找出两个单链表的首个公共节点
  9. oracle数据库sqlloader,Oracle SQL Loader(sqlldr)
  10. MySql常用函数汇总
  11. Apabi Reader 4.0.1正式发布!
  12. 扫码枪回车键条码_收银系统中扫描枪扫描条码后必须按回车键才能查询商品的解决办法...
  13. 微信第三方登录有两种登录方式, 1. 微信开放平台登录 2. 微信公众平台授权登录?
  14. Echarts legend组件 图例默认选中状态
  15. 为什么会出现淘宝客比价订单?怎样才能省钱购物?
  16. 浏览器ocx控件安装 IE浏览器可用
  17. 直播预告 | 双十一电商风控怎么破,看这场直播就对了!
  18. Educational Codeforces Round 40千名记
  19. java中bio_java中bio是什么
  20. STM32 PWM频率与占空比计算方式

热门文章

  1. VL813-Q7威锋一出四HUB芯片方案
  2. 使用eNSP搭建一个简单的网络
  3. html冻结页面,按下按钮后HTML页面会冻结
  4. Android一键加QQ群
  5. php保存文件快捷键,word保存快捷键是ctrl加什么
  6. RK3288 LED驱动编写
  7. 墨客和宁波市政府签订战略合作协议
  8. 在阿里云或腾讯云配置微信小程序
  9. AD16及AD18鼠标移动到网络后自动高亮设置
  10. [Python的奇妙开发]用tkinter实现Galgame引擎的建立(一)