前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >链表的基本操作

链表的基本操作

作者头像
pigeon
发布于 2022-04-11 11:40:40
发布于 2022-04-11 11:40:40
3680
举报
文章被收录于专栏:电子荣耀电子荣耀

1、定义链表结点类型

链表的基本操作

单向链表的主要操作包括:建立链表、向链表中插入和删除结点、遍历链表等。下面通过一个简单实例简要介绍单向链表的基本操作。

【例1】使用链表存放多个商品的资料,每个商品包括:商品编号和商品价格。

1、定义链表结点类型

程序中如果要使用链表,首先要定义描述链表结点的结构体类型,下面给出本例中结点的结构体定义:

struct product

{

int id;//商品编号

double price;//商品价格

struct product *next;//指针域

};

typedef struct product NODE;//为结点起别名

2.建立链表

建立链表是指在程序运行过程中,从无到有地建立起链表的过程。即逐个为结点分配内空间,输入结点数据,并建立起结点之间的前后链接关系。

下面给出建立链表的函数 create的定义,链表中结点的排列是按照数据输入的先后顺序,即后输入的数据排在链表的末尾,链表的头指针以函数返回值形式得到

函数的源代码如下:

NODE *create()

{

NODE *head, *tail,*p; //head-头指针,tail-尾指针

int id;

double price;

head=NULL; //头指针置为NULL,表示链表是空表

printf("输入编号和价格(编号为0表示结束):");

scanf("% d% If", &id, &price);

while(id>0)

{

p=(NODE *)malloc( sizeof(NODE));//分配一个结点的内存空间

//下面为结点成员赋值

p->id=id;

p->price=price;

p->next=NULL;

//下面if语句把新结点连接到链表的最后面

if(head==NULL)

{

head=p;//当链表为空时,新结点是第1个结点

}

else

{

tail->next=p;//链表不为空时,把新结点连接在原尾结点后面

}

tail=p; //tail指向新的尾结点

printf("输入编号和价格(编号为0表示结束):");

scanf("%d%lf",&id,&price);

}

return head;//返回值是链表的头指针

}

创建链表函数 create的说明:

(1)函数中定义了3个结点类型指针变量:head是链表的头指针;tail在链表建立过程中始终指向链表的末尾一个结点,增加的新结点直接链接到tail结点的后面即可;p指向链表创建过程中新增加的结点。

(2)函数的第6行把头指针head赋值为NULL,表示链表是空链表,即没有任何结点。

(3)创建链表时,每结点都要单独分配内存空间。函数第11行进行内存分配,循环每进行一次,就创建一个新结点。

(4)链表中第一个结点的创建与其他结点是不同的,直接让头指针head指向它即可(第19行),而其他结点需要链接到tail指针的后面(第23行)。

(5)循环中每次创建一个新结点并链接到链表尾部后,tail指向的结点就不再是尾结点,需要让tail指向新的尾结点(第25行)

(6)函数 create创建的链表返回给调用它的主调用函数时,只需要将头指针head作为函数的返回即可(第29行)。

(7)在main函数调用 create函数建立一个链表可以使用如下语句

NODE *head;//在main函数中定义头指针变量

head=create();//调用 create函数创建链表,并把链表的头指针赋值给head。

3.遍历链表

链表的遍历操作是指从链表的第1个结点开始,依次对链表中每一个结点进行一次访问,直到链表的结束为止。遍历链表使用循环结构实现,首先使指针p指向第1个结点,通过p对结点进行访问,访问完成后,使指针p指向下一结点。如此不断循环,直到链表结束(p为NULL)为止。

遍历操作中对结点的访问是一个通用概念,对结点的访问可以是:输出结点的数据域、修改结点数据域、对结点计数、对结点数据进行判断等。下面给出对链表进行输出和计数两种操作的函数。

输出链表所有结点的函数display的源代码如下:

void display( NODE *h)

{

NODE *p;

p=h;//p指向第1个结点

printf("-----------------------\n");

whilel(p!=NULL)//结束条件是p为NULL

{

printf("%10d, %10. 2f\n",p->id, p->price);

p=p->next;//使p指向下一个结点

}

printf("-----------------------\n");

}

输出链表函数 display几个关键地方:

(1)函数的参数h表示要输出的链表的头指针。

(2)指针p指向第1个结点,见代码第4行。

(3)判断链表是否结束的条件是p!=NULL,如果条件不成立,表示链表已经遍历完成。

(4)代码中第9行作用是使指针p指向它目前指向结点的下一个结点,该语句保证了循环是依次访问链表的所有结点,并能够到达链表末尾。

例如,main函数中已经建立一个头指针为head的链表,可以使用如下语句输出所有结点

display(head);//输出头指针head指向的链表

统计一个链表中结点的个数也是一种遍历操作,下面定义的函数 count的功能中统计个链表中共有多少个结点,函数的返回值是结点的个数。

int count( NODE *h)

{

NODE *p;

int n=0;

while(p!=NULL)

{

n++;

p=p->next;

}

return n;

}

main函数中使用如下语句可以得到头指针head指向的链表中结点个数:

int num=count(head);

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子荣耀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用Peach进行模糊测试从入门到放弃
本文对模糊测试技术进行了综述分析,介绍了开源模糊测试框架Peach的结构、原理及pit文件编写方法,旨在帮助对模糊测试感兴趣的小伙伴能快速入门peach,最后以常见的http协议和工控Modbus协议为例进行了实验。文末搜集了本文所用到的工具和相关资料供大家下载。
FB客服
2019/12/03
5.2K0
【实战】工控网络协议模糊测试:用peach对modbus协议进行模糊测试
本文来自 熊猫(s_panda) 的投稿 0×00 背景 本人第一次在FB发帖,进入工控安全行业时间不算很长,可能对模糊测试见解出现偏差,请见谅。 在接触工控安全这一段时间内,对于挖掘工控设备的漏洞,必须对工控各种协议有一定的了解,然后对工控协议,首先具备的对网络知识以及工控行业流程有所熟悉,其次就是对工控协议进行模糊测试。 0×01 模糊测试介绍 下面介绍一下模糊测试概念以及针对网络协议模糊测试的一些框架。 模糊测试就是通过非预期的输入并监视异常结果来发现软件故障的方法。(相对来说比较抽象,个人理
用户1631416
2018/04/12
3.4K0
【实战】工控网络协议模糊测试:用peach对modbus协议进行模糊测试
Peach原理简介与实战:以Fuzz Web API为例
Fuzz即模糊测试,是一种使用大量的随机数据测试系统安全的方法,Peach就是一种这样的工具。网上零零星星有些介绍Peach的文章,也有少部分使用Peach测试某种文件的教程(其实就是直接翻译官方文档),并没有针对实际协议的真正测试。初学者,往往无从下手,本文从实战出发,穿插讲解Peach套件的一些语法和原理,让你真正从0开始一段奇妙的模糊测试之旅!
FB客服
2019/11/27
2.9K0
关于Fuzz工具的那些事儿
前段时间一直在研究fuzz工具,这里就写篇文章总结一下下。 在安全测试中,模糊测试(fuzz testing)是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型。能够在一项产品投入市场使用之前对潜在的应当被堵塞的攻击渠道进行提示。 模糊测试(fuzz testing)和渗透测试(penetration test)都是属于安全测试的方法,它们有同也有异,渗透测试一般是模拟黑客恶意入侵的方式对产品进行测试,对测试者的执行力要求很高,成本高,难以被大规模应用。 而模糊测试,它能够充分利用机器
FB客服
2018/02/07
6.4K0
关于Fuzz工具的那些事儿
在渗透测试中使用fuzz技术(附windows安装指南)
前言:本文翻译自‍‍‍‍sans.org,有删节。在学习sulley的过程中发现中文参考资料很少,所以抛砖引玉翻译一下,希望对学习协议fuzz测试的同学有帮助。本文适合作为学习sulley协议测试过程中参考资料,如果需要学习sulley的使用可以参考其文档。 背景 不久前,我们接到了一个渗透测试的项目。分配任务的时候,团队里有的同学负责无线渗透,有的负责web应用渗透,我分到的任务是对外网开放的网络端口进行测试。我的主要测试范围包括:从外部可以访问的系统接口,不包括客户测的漏洞利用,不包括web应用,不包括
FB客服
2018/02/02
2K0
在渗透测试中使用fuzz技术(附windows安装指南)
模糊测试(fuzzing)是什么
大学时两个涉及“模糊”的概念自己感觉很模糊。一个是学数据库出现的“模糊查询”,后来逐渐明白是指sql的like语句;另一个是学专业课时出现的“模糊测试”。
顾翔
2019/12/12
1.5K0
模糊测试(fuzzing)是什么
一系列用于Fuzzing学习的资源汇总
本文主要是向大家推荐一系列,用于fuzzing和Exploit开发初始阶段学习的资源合集,其中将包括相关的书籍,课程 - 免费或收费的,视频,工具,教程,以及一些供大家练习使用的靶机应用。(PS:文内所有链接点击“阅读原文”均可查看)
FB客服
2018/07/30
2.3K0
关于Fuzzing模糊测试入门原理及实践的讨论
"The best alternative to defense mechanisms is to find and fix the bugs."
王驭停
2021/09/19
3.6K0
关于Fuzzing模糊测试入门原理及实践的讨论
Google内部Fuzz测试字典
项目地址: GitHub https://github.com/google/fuzzing
YanXia
2023/04/07
6340
Google内部Fuzz测试字典
面试官:了解Fuzzing Test吗?
测试同行或多或少听说过模糊测试,但不知道它是什么?本文将详细介绍Fuzzing Test帮助你快速了解它。
互联网金融打杂
2022/08/01
7920
从研究者的视角看Fuzzing技术发展30年
1988年,在威斯康星大学Barton Miller教授的计算机实验课上(http://pages.cs.wisc.edu/~bart/fuzz/CS736-Projects-f1988.pdf),首次提出Fuzz生成器(Fuzz Generator)的概念,用于测试Unix程序的健壮性,即用随机数据来测试程序直至崩溃。因此,Barton Miller教授也被多数人尊称为"模糊测试之父"。但是,当时更多是为了验证代码质量和程序的稳定性,而非专门用于挖掘安全漏洞,真正用于软件安全漏洞挖掘的开端要从下面两件事说起。
泉哥
2020/02/14
2.5K0
MikroTik-SMB 测试之 Mutiny-Fuzzer
Mutiny是由思科研究人员开发的一款基于变异的网络fuzz框架,其主要原理是通过从数据包(如pcap文件)中解析协议请求并生成一个.fuzzer文件,然后基于该文件对请求进行变异,再发送给待测试的目标。通过这种方式,可以在很短的时间内开始对目标进行fuzz,而不用关心相关网络协议的具体细节。
信安之路
2020/07/06
2.1K0
Sinec H1通信协议分析及模糊测试
Sinec H1是第一个基于以太网的工业协议,可提供传输层功能。该协议由西门子推出,目的是使用现有标准并丰富工业通信协议的相关细节,主要用于控制系统之间的数据传输。它具有大带宽特点,非常适合传输大量数据。基于ISO / IEC 8073标准,定义了不同的传输方法。
绿盟科技研究通讯
2019/12/11
2K0
Sinec H1通信协议分析及模糊测试
Scalpel:解构API复杂参数Fuzz的「手术刀」
Scalpel是一款自动化Web/API漏洞Fuzz引擎,该工具采用被动扫描的方式,通过流量中解析Web/API参数结构,对参数编码进行自动识别与解码,并基于树结构灵活控制注入位点,让漏洞Fuzz向量能够应对复杂的编码与数据结构,实现深度漏洞挖掘。
小阑本阑
2022/11/08
1.1K0
Scalpel:解构API复杂参数Fuzz的「手术刀」
123个Python黑客工具,再也不用问女朋友要手机密码了
今天的文章来源于dloss/python-pentest-tools,本文中列举了123个Python渗透测试工具,当然不仅于渗透~ 下面我们就开始吧~ ———————————————————————— 如果你想参与漏洞研究、逆向工程和渗透,我建议你时候用Python语言。Python已经有很多完善可用的库,我将在这里把他们列出来。 这个清单里的工具大部分都是Python写成的,一部分是现有C库的Python绑定,这些库在Python中都可以简单使用。 一些强力工具(pentest frameworks
小小科
2018/05/03
1.7K0
123个Python黑客工具,再也不用问女朋友要手机密码了
IOT漏洞研究:Web服务
路由器、防火墙、NAS和摄像头等由于功能复杂,为方便交互一般都会提供web管理服务,和服务器web相比,IOT的web功能较为简单,也就避免了一些复杂功能存在的漏洞,但是由于嵌入式设备的硬件瓶颈,设备自身的安全检测与防护能力有限,也就增加了其安全风险。 IoT Web服务 IOT web常采用开源框架+自研模块的方式,漏洞特点也较为明显: (一) 自研CGI模块中存在漏洞的概率较高,漏洞差异性大 (二) 开源框架(可能的)漏洞广泛存在各种设备,漏洞同源性强 虽然具体漏洞存在差异,但常见的大致分为几类。 2.
FB客服
2023/04/26
1.1K0
IOT漏洞研究:Web服务
网络协议基础:解读TCP/IP协议栈、HTTP、HTTPS、DNS等协议原理
这里推荐一篇实用的文章:《数据库加密数据模糊匹配查询技术方案》,作者:【Lorin 洛林】。
Echo_Wish
2024/11/27
3180
网络协议基础:解读TCP/IP协议栈、HTTP、HTTPS、DNS等协议原理
网络基础之网络协议篇
一、初识网络协议 网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标准上进行。一个很形象地比喻就是我们的语言,我们大天朝地广人多,地方性语言也非常丰富,而且方言之间差距巨大。A地区的方言可能B地区的人根本无法接受,所以我们要为全国人名进行沟通建立一个语言标准,这就是我们的普通话的作用。同样,放眼全球,我们与外国友人沟通的标准语言是英语,所以我们才要苦逼的学习英语。 英语成为世界上所有人通信的统一标准,如
用户1214487
2018/01/23
1.4K0
网络基础之网络协议篇
专为渗透测试人员设计的 Python 工具大合集
如果你对漏洞挖掘、逆向工程分析或渗透测试感兴趣的话,我第一个要推荐给你的就是Python编程语言。Python不仅语法简单上手容易,而且它还有大量功能强大的库和程序可供我们使用。在这篇文章中,我们会给大家介绍其中的部分工具。 注:本文罗列出来的工具绝大部分都是采用Python编写的,其中有一小部分还使用了C语言库。 Network(网络) lScapy:一款强大的交互式数据报分析工具,可用作发送、嗅探、解析和伪造网络数据包。 lpypcap、Pcapy和pylibpcap:配合libpcap一起使用的数据包
企鹅号小编
2018/02/08
1.4K0
专为渗透测试人员设计的 Python 工具大合集
网络协议的重要性与应用:理解进程间通信和网络分层结构(上)
进程间通信有多种方式,包括管道、消息队列、共享内存和信号等。然而,如果不同设备上的进程需要进行通信,就只能通过网络来实现。由于设备的多样性,为了兼容各种设备,就需要一个统一通用的网络协议。
努力的小雨
2023/11/27
7110
推荐阅读
相关推荐
使用Peach进行模糊测试从入门到放弃
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档