嵌入式学习DAY19 --- 数据结构开始学习(时间复杂度,顺序表)(1)

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

	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)
{
if(NULL == pList)
{
return LIST_ERROR;
}
int i;
for(i = 0;i < pList->count;i++)
{
if(pList->data[i] == oldata)
{
pList->data[i] = newdata;
}
}
return LIST_OK;
}

int search_list_item(List *pList,data_t tdata,int *pindex)
{
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 sort_list(List *pList)
{
if(NULL == pList)
{
return LIST_ERROR;
}
int i, j;
for(i = 0; i < pList->count-1; i++)
{
for(j = 0; j < pList->count-i-1; j++)
{
if(pList->data[j] > pList->data[j+1])
{
data_t tmp = pList->data[j];
pList->data[j] = pList->data[j+1];
pList->data[j+1] = tmp;
}
}
}
return LIST_OK;
}

void show_list(List *pList)
{
if(NULL == pList)
{
return;
}
int i;
for(i = 0;i < pList->count;i++)
{
printf(“%d\t”,pList->data[i]);
}
puts(“”);
}

void destroy_list(List **pplist)
{
if(NULL == pplist || NULL == *pplist)
{
return;
}
free(*pplist);
*pplist = NULL;
}

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取

48434)]
[外链图片转存中…(img-03g4Uphv-1715187848435)]
[外链图片转存中…(img-XRSymtXn-1715187848436)]
[外链图片转存中…(img-eys1UmjM-1715187848436)]
[外链图片转存中…(img-QlSwrlXT-1715187848437)]
[外链图片转存中…(img-lNzWkWUa-1715187848437)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值