1.定义每个直播间的唯一房间号为主Key ID;
2.定义直播间中的主播姓名为关键字 Name;
3.定义直播间所售卖的商品种类为关键字 Items;
4.定义直播间所卖出的销售额为关键字 Sales;
一.功能
1.创建:创建一个用来描述直播平台的哈希表。
2.增加:在直播平台中增加新的直播房间以及直播间中的主播、商品种类、 销售额
3.删除:在直播平台中删除一个直播间以及直播间里的主播、商品及销售额信息
4.修改:在直播平台中修改直播间中主播的信息或者商品的信息,修改最多的是销售额的 信息,但是直播间房间号不能修改
//此项功能今日尽量去实现,若时间不够,暂且不做
5.查找:在直播平台中根据主Key ID房间号来查找直播间信息
6.排序:在该系统中因为是电商平台直播,那么销售额就是直播平台最在意的,排序功能就是通过销售额来排序出从高到底
//此项功能今日尽量去实现,若时间不够,暂且不做
7.显示:用来显示直播平台中的信息,包括直播间、主播姓名、销售的商品种类、以及所创造的销售额
8.销毁:用来销毁这个直播平台,删除每个直播间中具体信息,然后释放掉整个哈希表
二.技术
1.Ubuntu
2.C语言
3.哈希表
4.文件IO
三.实现步骤
1.定义结构体
2.封装功能函数
3.测试功能实现
哈希函数:
主Key是直播间房间号
给房间号定义格式为 888*** 六位数
从888001为首个房间
运用叠加法计算 ,前三位与后三位相加
888+001=889
此后每个房间号都运用叠加法计算后来减889
四.具体实现
1.创建工程项目
因为我是用的Ubuntu,所以就建了一个文件夹 ZBGL
之后再这个大文件夹下分别创建
src
obj
include
bin
四个文件夹
2.代码实现
1>.zbgl.h----------------------------------------- 如下(此文件放在include文件夹下)
#ifndef \_ZBGL\_H\_
#define \_ZBGL\_H\_
#define SIZE 2000
typedef struct Zb
{
char id[10];//直播间的唯一房间号
char name[10];//直播间中主播的姓名
char items[15];//直播间中所销售的商品种类
float sales;//直播间所创造的销售额
}Zb;
typedef Zb data_t;
//节点
typedef struct HashNode
{
data_t data;
struct HashNode \*pNext;
}HashNode;
//哈希表
typedef struct Hash
{
HashNode \*hash[SIZE];
}Hash;
enum HASH_OP
{
HASH_ERR = -1,
HASH_OK,
NOT_FOUND
};
//创建
Hash \*createHash();
//插入
int insertZb(Hash \*pHash,data_t tData);
//删除
int deleteZb(Hash \*pHash,data_t \*pData);
//查找
int searchZb(Hash \*pHash,data_t \*pData);
//显示
void showHash(Hash \*pHash);
//销毁
void destroyHash(Hash \*\*ppHash);
#endif
2>.zbgl.c----------------------------------------- 如下(此文件放在src文件夹下)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../include/zbgl.h"
//创建一个电商直播管理平台系统的哈希表
Hash \*createHash()
{
Hash \*pHash = (Hash \*)malloc(sizeof(Hash));
if(NULL == pHash)
{
return NULL;
}
memset(pHash,0,sizeof(Hash));
return pHash;
}
//在电商平台管理系统的哈希表中来插入节点
//节点中包括直播间的唯一房间号、主播姓名、所销售的商品种类、以及所创造的销售额
int insertZb(Hash \*pHash,data_t tData)
{
if(NULL == pHash)
{
return HASH_ERR;
}
//创建节点
HashNode \*pNode = (HashNode\*)malloc(sizeof(HashNode));
if(NULL == pNode)
{
return HASH_ERR;
}
memset(pNode,0,sizeof(HashNode));
pNode->data = tData;
//根据主key计算要插入的位置
int index;
int id = atoi(pNode->data.id);
index = id/1000 + id%1000 - 889;
//插入
pNode->pNext = pHash->hash[index];
pHash->hash[index] = pNode;
return HASH_OK;
}
//删除一个节点
int deleteZb(Hash \*pHash,data_t \*pData)
{
if(NULL == pHash || NULL == pData)
{
return HASH_ERR;
}
//计算index
int index;
int id = atoi(pData->id);
index = id/1000 + id%1000 - 889;
//给房间号定义格式为 888\*\*\* 六位数
//从888001为首个房间
//运用叠加法计算 ,前三位与后三位相加 888+001=889
//此后每个房间号都运用叠加法计算后来减889
HashNode \*pTmp = pHash->hash[index];
if(NULL == pTmp)
{
return NOT_FOUND;
}
//如果要删除的节点刚好是链表的第一个节点,需要单独处理
if(0 == strcmp(pData->id,pTmp->data.id))
{
pHash->hash[index] = pTmp->pNext;
strcpy(pData->name,pTmp->data.name);
strcpy(pData->items,pTmp->data.items);
pData->sales = pTmp->data.sales;
free(pTmp);
pTmp = NULL;
return HASH_OK;
}
//删除的不是第一个节点
HashNode \*pDel = pTmp->pNext;
while(pDel != NULL)
{
if(0 == strcmp(pData->id,pDel->data.id))
{
//删除pDel
pTmp->pNext = pDel->pNext;
strcpy(pData->name,pTmp->data.name);
strcpy(pData->items,pTmp->data.items);
pData->sales = pTmp->data.sales;
free(pDel);
pDel = NULL;
return HASH_OK;
}
pTmp = pTmp->pNext;
pDel = pTmp->pNext;
}
return NOT_FOUND;
}
//查找一个节点,用直播间的房间号id来查询直播间的具体信息
//pDel参数:保存找到的节点的地址,给删除节点的时候用
//一般情况下可以给pDel传NULL
int searchZb(Hash \*pHash,data_t \*pData)
{
if(NULL == pHash || NULL == pData)
{
return HASH_ERR;
}
//计算index
int index;
int id = atoi(pData->id);
index = id/1000 + id%1000 - 998;
//遍历index位置处的链表
HashNode \*pTmp = pHash->hash[index];
if(NULL == pHash->hash[index])
{
return NOT_FOUND;
}
else
{
while(pTmp != NULL)
{
//将链表中的每一个节点和传进来的id进行比较
if(0 == strcmp(pTmp->data.id,pData->id))
{
strcpy(pData->name,pTmp->data.name);
strcpy(pData->items,pTmp->data.items);
pData->sales = pTmp->data.sales;
return HASH_OK;
}
pTmp = pTmp->pNext;
}
}
return NOT_FOUND;
}
3>.main.c----------------------------------------- 如下(此文件放在src文件夹下)
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include "../include/zbgl.h"
int main(int argc, const char \*argv[])
{
Hash \*pHash = createHash();
if(NULL == pHash)
{
printf("该系统创建失败!\n");
return -1;
}
int cmd;
data_t zb = {0};
//判断文件存在不存在
int fd = open("mmm.txt",O_RDWR | O_APPEND);
if(fd < 0)
{
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
![](https://img-blog.csdnimg.cn/img_convert/311903982dea1d8a5d2c98fc271b5b41.jpeg)
### 学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
![](https://img-blog.csdnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)
#### 网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份**我自己整理的网络安全入门工具以及使用教程和实战。**
![](https://img-blog.csdnimg.cn/img_convert/bcd1787ce996787388468bb227d8f959.jpeg)
#### 项目实战
最后就是项目实战,这里带来的是**SRC资料&HW资料**,毕竟实战是检验真理的唯一标准嘛~
![](https://img-blog.csdnimg.cn/img_convert/35fc46df24091ce3c9a5032a9919b755.jpeg)
#### 面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**