查看原文
其他

各大平台热搜排行榜原型

De掉所有bug 程序人生 2018-10-28

点击上方“程序人生”,选择“置顶公众号”

第一时间关注程序猿(媛)身边的故事


作者

De掉所有bug

来源

https://blog.csdn.net/weixin_41676881/article/details/81007261

已获原作者授权,如需转载,请联系原作者。


前言:腾讯、新浪微博等平台都有一个热搜的功能,目的是让用户看到最近一段时间网友们都在搜索什么,以便实时掌握热点资讯。热搜排行榜的算法其实非常简单,用C语言就可以写出来。

编程思想:每个被搜索的词条都是一个结构体,所有的被搜索词条构成了一个结构体数组,也就是一个线性结构。被搜索词条这个结构体中有两个成员变量,一个是用于存放搜索次数的整形变量sum,sum要被赋初值为0;另一个是用于存放关键词的字符串key。

将每次用户的输入分成两种情况,第一种情况是之前已经被搜索过的关键词,第二种情况则是之前从来没有被搜索过的关键词。若是第一种情况则让该词条的搜索次数自加1;若是第二种情况则要将新的用户输入作为新词条存储到由被搜索词条构成的结构体数组中,并让该新词条的搜索次数自加1,此时该新词条的搜索次数由初始化后的0变为1。

经过一系列的搜索操作,每个被搜索的词条都有了一定的搜索次数,最后运用选择排序法或者其他排序算法根据搜索次数由多到少将词条进行排序,一个热搜排行榜便在不知不觉中形成了。

代码如下,需要注意的是根据用户输入情况的不同对被搜索词条数目num的操作:

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. //声明结构体:词条keyw

  5. typedef struct

  6. {

  7. //用于存放搜索次数

  8. int sum;

  9. //用于存放关键词

  10. char key[20];

  11. }keyw;

  12. //num为被搜索词条的总数

  13. int num=0;

  14. //被搜索词条的上限是1024条

  15. keyw keywo[1024];

  16. //自定义函数的声明

  17. void input(keyw *x,char str[],int *num);

  18. void show(keyw *x,int num);


  19. void main()

  20. {

  21. //choice为用户的热键

  22. int choice;

  23. //keywords为用户的输入内容

  24. char keywords[20];

  25. //给所有被搜索词条的搜索次数赋初值0

  26. for(int i=0;i<1024;i++)

  27. keywo[i].sum=0;

  28. /*------------------------------启用菜单------------------------------*/

  29. system("cls");

  30. system("color f0");

  31. do

  32. {

  33. //程序功能展示菜单

  34. printf("\t\t\t欢迎使用LittleBox搜索引擎!\n");

  35. printf("*************************************************************************\n");

  36. printf("\n搜索请输入1\t\t查看热搜榜请输入2\n\n");

  37. printf("退出程序请输入0\n\n");

  38. printf("*************************************************************************\n");

  39. printf("请输入您的选择:");

  40. scanf("%d",&choice);

  41. fflush(stdin);

  42. switch(choice)

  43. {

  44. case 1:

  45. printf("请输入搜索关键词:");

  46. scanf("%s",keywords);

  47. //此时搜索词条数+1 若为被重复搜索的关键词 则在input函数中让其值-1

  48. num++;

  49. input(keywo,keywords,&num);

  50. break;

  51. case 2:

  52. show(keywo,num);

  53. break;

  54. case 0:

  55. printf("\n您已成功退出!\n");

  56. //正常退出程序

  57. exit(0);

  58. break;

  59. default:

  60. printf("\t\t\t对不起,您的选择有误,请重新输入!\n");

  61. }

  62. system("pause");

  63. system("cls");

  64. }while(1);

  65. }


  66. //自定义函数的实现


  67. /*

  68. 传入的参数为:

  69. 由所有被搜索词条构成的kwyw型(自定义类型)的线性结构

  70. 输入的内容str

  71. 被搜索词条的总数num的地址

  72. */

  73. void input(keyw *x,char str[],int *n)

  74. {

  75. //flag用于判断输入的内容是否为被重复搜索的关键词

  76. int flag=0;

  77. int i;

  78. for(i=0;i<(*n)-1;i++)

  79. if(strcmp(x[i].key,str)==0)

  80. {

  81. //此时用户输入为被重复搜索的关键词

  82. //让被搜索词条数-1

  83. (*n)--;

  84. //该词条的搜索次数+1

  85. x[i].sum++;

  86. flag=1;

  87. break;

  88. }

  89. if(flag==0)

  90. {

  91. //此时用户输入为新的关键词

  92. //将用户输入作为新词条存储到线性结构上

  93. strcpy(x[*n-1].key,str);

  94. //让新词条的搜索次数+1

  95. x[*n-1].sum++;

  96. }

  97. }

  98. /*

  99. 传入的参数为:

  100. 由所有被搜索词条构成的kwyw型(自定义类型)的线性结构

  101. 被搜索词条的总数num

  102. */

  103. void show(keyw *x,int num)

  104. {

  105. int i,j;

  106. keyw t;

  107. //用选择排序法根据搜索次数由多到少将词条进行排序

  108. for(i=0;i<num-1;i++)

  109. for(j=i;j<num;j++)

  110. if(x[i].sum<x[j].sum)

  111. {

  112. t=x[i];

  113. x[i]=x[j];

  114. x[j]=t;

  115. }

  116. //输出排序结果

  117. printf("%20s%20s\n","排名","关键词");

  118. for(i=0;i<num;i++)

  119. printf("%20d%20s\n",i+1,x[i].key);

  120. }

以上代码的缺点是没有动态分配和释放内存,以及为了省事直接将被搜索词条的上限设置成了1024。不过大体上可以反映整个编程思想,代码中的注释也很详细。

 

程序效果:

搜索关键词“支付宝法人变更”1次

搜索关键词“刘强东回国”2次

搜索关键词“延禧攻略”3次

搜索关键词“香蜜大结局”4次

搜索关键词“京东客服”5次

搜索关键词“刘强东爆红网络”6次

形成了如下图所示的热搜排行榜:

 

- The End -

「若你有原创文章想与大家分享,欢迎投稿。」

加编辑微信ID,备注#投稿#:

程序 丨 druidlost  

小七 丨 duoshangshuang


翻日历看到今天是教师节,愿全天下的老师:

上期精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存