给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
void destroyList(List **ppList);
void showList(List *pList);
#endif //防止头文件重复包含
*第二步:编辑一个list.c文件,用来具体编写各个功能如何实现*
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include “list.h”
/*功能:创建一个顺序表
* 返回值:成功 顺序表的首地址
* 失败:NULL
*/
List *createList()
{
List *pList = (List *)malloc(sizeof(List));
if(NULL == pList)
{
return NULL;
}
memset(pList, 0, sizeof(List));
return pList;
}
/*
* 功能:给顺序表插入一个元素
* 参数:pList 顺序表的首地址
* iOffset 插入的位置
* tData 插入的值
*返回值:成功 LIST_OK
失败 LIST_ERROR
*/
int insertItemList(List *pList, int iOffset, data_t tData)
{
if(NULL == pList || iOffset < 0 || iOffset >= SIZE || SIZE == pList->count)
{
return LIST_ERROR;
}
//根据iOffset将tData插入
int i;
for(i = pList->count-1; i >= iOffset; i--)
{
pList->data[i+1] = pList->data[i];
}
pList->data[iOffset] = tData;
pList->count++;
return LIST_OK;
}
/*
* 功能:删除一个元素
* 参数:pList 首地址
* iOffset 删除的位置
* pData 保存删除的元素
*返回值:成功 LIST_OK
失败 LIST_ERROR
*/
int deleteItemList(List *pList, int iOffset, data_t *pData)
{
if(NULL == pList || iOffset < 0 || iOffset >= SIZE || NULL == pData || 0 == pList->count)
{
return LIST_ERROR;
}
//保存要删除的值
\*pData = pList->data[iOffset];
//删除:用后面的元素把前面的覆盖掉,count--
int i;
for(i = iOffset; i < pList->count-1; i++)
{
pList->data[i] = pList->data[i+1];
}
pList->count--;
return LIST_OK;
}
int updateList(List *pList, data_t oldData, data_t newData)
{
if(NULL == pList)
{
return LIST_ERROR;
}
//一旦发现顺序表中元素的值等于oldData就换成newData
int i;
for(i = 0; i < pList->count; i++)
{
if(pList->data[i] == oldData)
{
pList->data[i] = newData;
}
}
return LIST_OK;
}
int searchItemList(List *pList, data_t tData, int *pIndex)
{
//查找tData,如果找到了,就将这个元素的下标赋值给*iIndex
//如果没有找到,就返回NOT_FOUND
if(NULL == pList || NULL == pIndex)
{
return LIST_ERROR;
}
int i;
for(i = 0; i < pList->count; i++)
{
if(pList->data[i] == tData)
{
*pIndex = i;
return LIST_OK;
}
}
return NOT_FOUND;
}
int sortList(List *pList)
{
}
void destroyList(List **ppList)
{
if(NULL == ppList || NULL == *ppList)
{
return;
}
free(*ppList);
*ppList = NULL;
}
void showList(List *pList)
{
if(NULL == pList)
{
return;
}
int i;
for(i = 0; i < pList->count; i++)
{
printf(“%d “, pList->data[i]);
}
printf(”\n”);
}
第三步:编辑一个main.c文件用来具体实现如何调用
#include<stdio.h>
#include “list.h”
int main()
{
List *pList = createList();
if(NULL == pList)
{
printf(“创建失败!\n”);
return -1;
}
int i, ret;
for(i = 0; i < 3; i++)
{
ret = insertItemList(pList, i, i+100);
if(LIST_ERROR == ret)
{
printf("插入失败!\n");
return -1;
}
}
showList(pList);
ret = insertItemList(pList, 0, 888);
if(LIST_ERROR == ret)
{
printf("插入失败!\n");
return -1;
}
showList(pList);
data_t data;
deleteItemList(pList, 2, &data);
printf("删除的元素:%d\n", data);
showList(pList);
updateList(pList, 888, 999);
showList(pList);
printf("请输入要查找的数据:");
scanf("%d", &data);
int index;
ret = searchItemList(pList, data, &index);
if(NOT_FOUND == ret)
{
printf("没有找到!\n");
}
else
{
printf("查找的结果是:%d\n", index);
}
//destroy之后pList就变成了NULL
destroyList(&pList);
return 0;
}
扩展:
我们讲的顺序表的大小是固定的,最多只能是5个元素,那么能不能进行扩容呢?
也就是就算满了,我再继续插入也是可以的
**顺序表的动态扩容**
现在遇到的问题:原来的空间不够用了,会导致插入失败
解决办法:申请一块更大的空间,把原来小的空间的内容全部拷贝到新的空间,把要插入的数据插入到新的空间,将原来旧的空间给释放掉
Insert()
{
如果顺序表满了,就申请更大的空间
也就是data的大小变化了
}
回忆昨天的顺序表是如何定义的:
Struct List
{
Data_t data[SIZE];
Int count;
};
但是data\_t data[SIZE];这个数组大小没办法改变,因为data是数组名,是常量,没办法修改
所以结构体需要重新定义
Struct List
{
Data_t *data; //首地址
Int count; //元素的个数
Int size; //数组的容量
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210322183837870.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NwcmluZ1dKTg==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021032218384899.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NwcmluZ1dKTg==,size_16,color_FFFFFF,t_70)
基础代码同上方差不多,我在这只贴出来list.c的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include “list.h”
List *createlist()
{
List *pList = (List *)malloc(sizeof(List));
if(NULL == pList)
{
return NULL;
}
memset(pList,0,sizeof(List));
//给data赋值,让data指向一块连续的内存空间
pList->size = SIZE;
pList->data = (data_t \*)malloc(sizeof(data_t)\*pList->size);
if(NULL == pList->data)
{
return NULL;
}
memset(pList->data, 0, sizeof(data_t)\*pList->size);
return pList;
}
int insert_list_item(List *pList,int ioffset,data_t tdata)
{
if(NULL == pList || ioffset < 0 || ioffset > pList->size)
{
printf(“1111\n”);
return LIST_ERROR;
}
//当表满的时候,需要实现扩容
if(pList->size == pList->count)
{
//先保存一下原来的size
int size = pList->size;
//申请一块更大的空间
pList->size += 5;
data_t \*pTmp = (data_t \*)malloc(sizeof(data_t) \* pList->size);
if(NULL == pTmp)
{
printf("222\n");
return LIST_ERROR;
}
memset(pTmp, 0, sizeof(data_t)\*pList->size);
//将原来小的空间的内容拷贝到新的空间
memcpy(pTmp, pList->data, sizeof(data_t)\*size);
//将原来的空间释放
free(pList->data);
//使得data指向新的空间
pList->data = pTmp;
}
int i;
for(i = pList->count-1;i >= ioffset;i--)
{
pList->data[i+1] = pList->data[i];
}
pList->data[ioffset] = tdata;
pList->count++;
return LIST_OK;
}
int delete_list_item(List *pList,int ioffset,data_t *pdata)
{
if(NULL == pList || ioffset < 0 || ioffset > pList->count || NULL ==pdata || 0 == pList->count)
{
return LIST_ERROR;
}
*pdata = pList->data[ioffset];
int i;
for(i = ioffset;i < pList->count - 1;i++)
{
pList->data[i] = pList->data[i+1];
}
pList->count–;
return LIST_OK;
}
int update_list_item(List *pList,data_t oldata,data_t newdata)
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网络安全面试题
绿盟护网行动
还有大家最喜欢的黑客技术
网络安全源码合集+工具包
所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!