专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

开源C语言库Melon双向链表使用

  本篇主要介绍开源C语言库Melon的双向链表使用,对开源C库感兴趣的读者可以访问:
  github。comWaterMelonMelon。链表简介
  先简单介绍一下什么是双向链表。可以参考下图:
  简单来说,链表是将一个一个的结点,通过指针连接起来。而双向链表则是每一个结点不仅记录了指向下一结点的指针,也记录了指向前一结点的指针。
  Melon中的双向链表属于上图中带有尾部结点的双向链表。
  双向链表的优势:结点的插入和删除操作的时间复杂度为O(1),所以应对频繁插入和删除的场景,是非常适合的。双向链表使用
  我们先定义一个自定义结构体类型:typedefstructtests{intval;}testt;
  后续的介绍中,我们要做的就是使用Melon的链表组件对这个结构进行改造,将其构建成一个双向链表。
  在Melon中,双向链表有两种实现。两种实现进行对比也各有其特点,因此读者在了解各自特点后,可根据自己需要进行选择使用。第一种实现
  我们直接上代码,然后再进行说明:includestdio。hincludestdlib。hincludemlndefs。htypedefstructtests{intval;structtestsprev;structtestsnext;}testt;MLNCHAINFUNCDECLARE(test,testt,staticinlinevoid,);MLNCHAINFUNCDEFINE(test,testt,staticinlinevoid,prev,next);intmain(void){inti;testtheadNULL,tailNULL,t;for(i0;i10;i){t(testt)malloc(sizeof(testt));if(tNULL){fprintf(stderr,mallocfailed。);return1;}tvali;tprevtnextNULL;testchainadd(head,tail,t);}for(thead;t!NULL;ttnext){printf(d,tval);}return0;}
  这段代码中,main函数中的内容很简单,利用一个for循环,malloc10个testt结构,然后将其val填充数值。随后利用testchainadd函数将这些结点连成一个链表。然后利用for循环遍历结点并打印val的值。
  下面问题就来了,testchainadd哪里来的?
  我们看到main前有两个MLNCHAINFUNCxxx的宏,这两个宏是在Melon的mlndefs。h头文件中定义的,用来对链表的插入和删除函数进行定义和声明的。MLNCHAINFUNCDECLARE第一个参数:函数名前缀第二个参数:自定义结构体类型第三个参数:函数返回值及函数类型第四个参数:函数参数限制属性(本例没有使用)MLNCHAINFUNCDEFINE第一个参数:函数名前缀第二个参数:自定义结构体类型第三个参数:函数返回值及函数类型第四个参数:自定义结构中用于访问前一结点的指针成员名字第五个参数:自定义结构中用于访问下一结点的指针成员名字
  这两个宏会定义和声明两个函数,分别名为:testchainadd和testchaindel,这两个函数的原型类似如下形式:void(chainop)(typehead,typetail,typenode);
  第一个参数为双向链表首指针的指针,第二个参数为双向链表尾指针的指针,第三个参数为要被操作的结点指针。特点
  这种实现方案的好处是:插入和删除函数可以被定义成inline或者增加一些其他属性。并且在遍历链表时,只需要访问自定义结点的prev和next指针即可。
  缺点是:使用者需要知道自定义结构中自己加入的prev和next成员名字,以及如果定义了很多双向链表,则需要配套定义很多插入和删除函数,会增加可执行程序的体积。第二种实现
  这种实现可能比较常见了。我们直接看代码:includemlnlist。hincludemlndefs。hincludestdlib。htypedefstruct{intval;mlnlisttnode;}testt;intmain(void){inti;testtt;mlnlisttsentinelmlnlistnull();for(i0;i3;i){t(testt)calloc(1,sizeof(t));if(tNULL)return1;mlnlistadd(sentinel,tnode);tvali;}for(tmlncontainerof(mlnlisthead(sentinel),testt,node);t!NULL;tmlncontainerof(mlnlistnext(tnode),testt,node)){printf(d,tval);}return0;}
  主函数的行为与第一种实现的代码是完全一样的。差别在于如下几方面:引入了mlnlist。h头文件testt中不再是添加prev和next成员,而是加入一个固定类型的成员,即mlnlistt类型的node成员。双向链表的首尾指针改为了一个名叫sentinel的mlnlistt类型变量。链表插入函数不再是自定义前缀函数,而是一个固定名称的函数名为mlnlistadd。访问链表首结点使用mlnlisthead宏想获取链表结点所在的宿主结构(即本例的testt)指针,需要使用mlndefs。h中的mlncontainerof宏。特点
  这种实现的优劣分别是:
  优势:使用者不需要关心链表的具体实现细节,只需要在自定义类型中引入mlnlistt类型成员即可。并且函数的插入和删除操作都是固定名称的,分别为:mlnlistadd和mlnlistremove。
  劣势:对链表结点所属的宿主结点(testt)的访问需要借助mlncontainerof宏,这看上去并不如第一种实现中那么直观。且链表操作函数都是非inline的,因此频繁调用的开销会高于第一种实现。
  事实上,感兴趣的读者可能会发现,第二种双向链表(mlnlist。c),是使用第一种双向链表来实现的。结语
  感谢阅读,感兴趣的读者可以访问Melon库查看更多细节,Melon是一个无依赖且开箱即用的开源C语言库,并且有配套的中英文文档。
  Github传送门:
  github。comWaterMelonMelon

特斯拉充电桩安装流程和攻略(电表申请充电桩选购和安装)对于开新能源电动汽车的车主来说,最方便最划算的充电方式,还是安装一套家用充电桩。家用充电桩安装其实也非常简单。但是有几个细节提醒大家还是要注意一下。下面以我的特斯拉modely来举工信部回应手机eSIM卡问题,表示正在研究,待成熟后扩大范围前不久,苹果发布新的iPhone14系列,在美国市场取消了实体SIM卡槽,而是采用了eSIM卡,不过国内的iPhone14系列依旧采用的是实体SIM卡。可能这也引发了网友的好奇,近九月下半月这四个板块或将迎来报复性上涨九月下半月的行情从今天开启,大盘经过上半月的震荡,上证指数只是下跌了2。22点,微跌0。07,上半月行情从原点回到了原点。然而,下半月的第一个交易日,大盘就出现了大幅调整,上证指数胡鑫溢9。16黄金白银破位下跌后还会涨吗,中长期走势解读不要对过去念念不忘,也不要去预测未来,前者对你无益,后者是徒劳的,预测是主观的,市场是客观的。你要做的是就是完善交易系统,来应对各种变化!一个失败的交易者之所以失败,原因之一就是他夜读丨在最美的秋天,遇见最美的自己。文字丨琉璃疏影主播丨富华仿若一转眼,秋色又浓了。仿若一张素白的宣上,被随意泼墨,瞬间就有了五颜六色的模样。想必,秋天就是这样。来了,便如千军万马,浩浩荡荡。一夜秋雨,一缕秋风,便秋天的早晨大概是因为晚上没有休息好,之所以没有休息好,因为楼上每每到半夜就会出现挪动桌椅的声音,每次都能成功的从睡梦中惊醒。晚上晚起了十分钟。这十分钟换来的是双腿猛蹬自行车。以为这种猛蹬会无三城一区助力建设北京国际科技创新中心当今世界,科学技术日益渗透到社会建设的各个领域,成为生产力中最活跃的因素。北京充分发挥科技和人才优势,深入贯彻落实创新驱动发展战略,积极服务国家重大战略需求,全力推进科技创新中心建北京顺义7项20条新举措全力稳就业近日,北京市顺义区出台关于全力做好稳就业保就业工作的若干措施,推出7大项20条新举措,围绕提标扩面挖岗增效,在帮助企业稳岗扩岗提升劳动者职业技能助力创新创业带动就业保障重点群体就业2022年,搭载好屏的笔记本有哪些?看准华硕好屏就对了对于许多轻薄本用户来说,笔记本的性能固然重要,但是大家对于屏幕都非常看重,如今有越来越多用户选购笔记本电脑时愈发重视笔记本屏幕。而2022年下半年的当下,什么样的笔记本屏幕入手体验出口量跃居世界第二!中国汽车都卖到哪里去了?中汽协数据显示,8月份国内车企出口量首次超过30。8万辆,同比增长65,其中,乘用车26万辆,商用车4。9万辆。新能源汽车的增长尤其明显,出口8。3万辆,同比大增82。在国内汽车市驻埃及使馆发布中国公民持落地签证入境埃及注意事项中国侨网9月17日电中国驻埃及大使馆微信公众号9月16日发布关于中国公民持落地签证入境埃及的注意事项一文,提醒拟赴埃持落地签证入境的中国公民注意相关规定。文中指出,近期,部分中国公
CBA三热点赵睿夺MVP,广东官宣汉密尔顿加盟,林书豪将去台湾1CBA全明星正赛,南区大胜北区队,这是南区连续五年战胜北区队了,赵睿表现出色夺得MVP,这也是他第二次夺得全明星MVP,上一次是20192020赛季,本场比赛,赵睿全场19投10荷兰队31击败美国队率先晋级八强新华社多哈12月3日电(记者张泽伟刘旸郑昕)荷兰队距离夺冠的目标又近了一步。3日,范加尔率领的荷兰队较为轻松地以31战胜美国队,成为第一支晋级卡塔尔世界杯八强的队伍。两传一射的邓弗我国多家芯片企业押注RISCV芯片,致力于摆脱美国芯片限制的束缚在美国收紧对我国实体出口先进芯片技术和设备的限制之际,我国多家企业押注一种开源的芯片设计架构能够帮助我国实现半导体的自给自足。在本周早些时候的一次行业活动中,11家半导体公司公布了世界杯阿根廷VS澳大利亚梅西首发迎千场里程碑迪马利亚替补北京时间12月4日凌晨3点,2022卡塔尔世界杯第二场18决赛,阿根廷队迎战澳大利亚队。赛前,两队公布了首发名单,迎来职业生涯第1000场里程碑的梅西先发出场,亚历杭德罗戈麦斯回归清远连山金子山现雾凇冰挂奇景,宛如海底白珊瑚近日,强冷空气来袭,清远连山最低气温跌破零度,一夜入冬。连山金子山迎来今年第一场雾凇,云雾中的树木在低温下形成了冰挂奇观。不同的树木建筑由于颜色造型不同,形成的冰挂也是色彩斑斓造型2022自驾最北方,游原汁原味的大兴安岭(之八,打卡漠河舞厅)8月4日,自驾最北方的第四天。到漠河时,天气阴了下来,时不时下点儿雨。最想看的就是五六火灾纪念馆,可惜现在正在维修,没有开放。1987年5月6日的这场大火,是建国后最严重的一场森林泸沽湖因其独特的摩梭风情和秀丽的山水风光闻名于世泸沽湖因其独特的摩梭风情和秀丽的山水风光闻名于世泸沽湖是摩梭族的母亲湖,它位于四川省盐源县与云南省宁蒗县交界处,是我国第三大的深水湖泊,摩梭族人民就依此湖泊生存居住。泸沽湖的面积有王长伟十二月三日农历十一月初十思故乡叶县常村的山王长伟十二月三日农历十一月初十思故乡叶县常村的山一hr分水岭常村柴巴分水岭,因山分水取此名。东临李木匠村旁,西接方城县山峰。南依陡峭叼崖山,北靠三道弯葱茏。南北走向风景秀,随处可见水上古城(60)202014聊城有特点,城中一大片水域,据说是北宋后历代官府将原护城河越挖越大,并陆续引入城东运河之水,逐渐形成的东昌湖。湖中这座古城,就是从前的东昌府府城,得益于明清两代四百多年漕运兴盛,曾很想出去走走看看很想出去走走看看,看看他乡的山和水。自己的生活工作圈子很小,一直都没有离开自己所在的家乡所在的县(县级市)工作和生活过,去郑州也是有事而去,不是真正的走走看看吧。以前出去的机会是很天台上没有许家印!大家想多了,新能源汽车能否缔造足球的神话?11月1号,恒大汽车内部发布停工留职通知书的截图被流传。11月2号,关于许家印跳楼的谣言在网上引起了轩然大波!一时间网友议论纷纷,于是昨晚,逼得许家印本人不得不现身辟谣。网友表示这
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网