各大平臺熱搜排行榜原型
點選上方“ 程式人生 ”,選擇“置頂公眾號”
第一時間關注程式猿(媛)身邊的故事
作者
De掉所有bug
來源
https://blog.csdn.net/weixin_41676881/article/details/81007261
已獲原作者授權,如需轉載,請聯絡原作者。
前言:騰訊、新浪微博等平臺都有一個熱搜的功能,目的是讓使用者看到最近一段時間網友們都在搜尋什麼,以便實時掌握熱點資訊。熱搜排行榜的演算法其實非常簡單,用C語言就可以寫出來。
程式設計思想:每個被搜尋的詞條都是一個結構體,所有的被搜尋詞條構成了一個結構體陣列,也就是一個線性結構。被搜尋詞條這個結構體中有兩個成員變數,一個是用於存放搜尋次數的整形變數sum,sum要被賦初值為0;另一個是用於存放關鍵詞的字串key。
將每次使用者的輸入分成兩種情況,第一種情況是之前已經被搜尋過的關鍵詞,第二種情況則是之前從來沒有被搜尋過的關鍵詞。若是第一種情況則讓該詞條的搜尋次數自加1;若是第二種情況則要將新的使用者輸入作為新詞條儲存到由被搜尋詞條構成的結構體陣列中,並讓該新詞條的搜尋次數自加1,此時該新詞條的搜尋次數由初始化後的0變為1。
經過一系列的搜尋操作,每個被搜尋的詞條都有了一定的搜尋次數,最後 運用選擇排序法或者其他排序演算法根據搜尋次數由多到少將詞條進行排序 ,一個熱搜排行榜便在不知不覺中形成了。
程式碼如下, 需要注意的是根據使用者輸入情況的不同對被搜尋詞條數目num的操作 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//宣告結構體:詞條keyw
typedef struct
{
//用於存放搜尋次數
int sum;
//用於存放關鍵詞
char key[20];
}keyw;
//num為被搜尋詞條的總數
int num=0;
//被搜尋詞條的上限是1024條
keyw keywo[1024];
//自定義函式的宣告
void input(keyw *x,char str[],int *num);
void show(keyw *x,int num);
void main()
{
//choice為使用者的熱鍵
int choice;
//keywords為使用者的輸入內容
char keywords[20];
//給所有被搜尋詞條的搜尋次數賦初值0
for(int i=0;i<1024;i++)
keywo[i].sum=0;
/*------------------------------啟用選單------------------------------*/
system("cls");
system("color f0");
do
{
//程式功能展示選單
printf("\t\t\t歡迎使用LittleBox搜尋引擎!\n");
printf("*************************************************************************\n");
printf("\n搜尋請輸入1\t\t檢視熱搜榜請輸入2\n\n");
printf("退出程式請輸入0\n\n");
printf("*************************************************************************\n");
printf("請輸入您的選擇:");
scanf("%d",&choice);
fflush(stdin);
switch(choice)
{
case 1:
printf("請輸入搜尋關鍵詞:");
scanf("%s",keywords);
//此時搜尋詞條數+1 若為被重複搜尋的關鍵詞 則在input函式中讓其值-1
num++;
input(keywo,keywords,&num);
break;
case 2:
show(keywo,num);
break;
case 0:
printf("\n您已成功退出!\n");
//正常退出程式
exit(0);
break;
default:
printf("\t\t\t對不起,您的選擇有誤,請重新輸入!\n");
}
system("pause");
system("cls");
}while(1);
}
//自定義函式的實現
/*
傳入的引數為:
由所有被搜尋詞條構成的kwyw型(自定義型別)的線性結構
輸入的內容str
被搜尋詞條的總數num的地址
*/
void input(keyw *x,char str[],int *n)
{
//flag用於判斷輸入的內容是否為被重複搜尋的關鍵詞
int flag=0;
int i;
for(i=0;i<(*n)-1;i++)
if(strcmp(x[i].key,str)==0)
{
//此時使用者輸入為被重複搜尋的關鍵詞
//讓被搜尋詞條數-1
(*n)--;
//該詞條的搜尋次數+1
x[i].sum++;
flag=1;
break;
}
if(flag==0)
{
//此時使用者輸入為新的關鍵詞
//將使用者輸入作為新詞條儲存到線性結構上
strcpy(x[*n-1].key,str);
//讓新詞條的搜尋次數+1
x[*n-1].sum++;
}
}
/*
傳入的引數為:
由所有被搜尋詞條構成的kwyw型(自定義型別)的線性結構
被搜尋詞條的總數num
*/
void show(keyw *x,int num)
{
int i,j;
keyw t;
//用選擇排序法根據搜尋次數由多到少將詞條進行排序
for(i=0;i<num-1;i++)
for(j=i;j<num;j++)
if(x[i].sum<x[j].sum)
{
t=x[i];
x[i]=x[j];
x[j]=t;
}
//輸出排序結果
printf("%20s%20s\n","排名","關鍵詞");
for(i=0;i<num;i++)
printf("%20d%20s\n",i+1,x[i].key);
}
以上程式碼的缺點是沒有動態分配和釋放記憶體,以及為了省事直接將被搜尋詞條的上限設定成了1024。不過大體上可以反映整個程式設計思想,程式碼中的註釋也很詳細。
程式效果:
搜尋關鍵詞“支付寶法人變更”1次
搜尋關鍵詞“劉強東回國”2次
搜尋關鍵詞“延禧攻略”3次
搜尋關鍵詞“香蜜大結局”4次
搜尋關鍵詞“京東客服”5次
搜尋關鍵詞“劉強東爆紅網路”6次
形成了如下圖所示的熱搜排行榜:
- The End -
「若你有原創文章想與大家分享,歡迎投稿。」
加編輯微信ID,備註#投稿#:
程式 丨 druidlost
小七 丨 duoshangshuang
翻日曆看到今天是教師節,願全天下的老師:
上期精彩內容