实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求:

input:

1 2 5 3 4

output:

1->2->5->3->4

相当于仅仅实现了插入、遍历2个功能(当然遍历功能稍微修改就是销毁链表了)

用纯C写了份测试代码

/*基本数据结构的定义以及函数的声明 */

typedef intElemType;

typedefstructNode

{

ElemType elem;struct Node*next;

} Node,* NodePtr, **ForwardList;

NodePtr createNode(ElemType x);voidshowList(ForwardList lst);voiddestroyList(ForwardList lst);//创建元素为x的节点并插入到节点where后面//若where为NULL, 则插入到链表lst的首部作为首节点//返回新节点的指针

NodePtr insertAfterNode(NodePtr where, ElemType x,

ForwardList lst);

/*链表相关函数的具体实现*/NodePtr createNode(ElemType x)

{

NodePtr pNode= (NodePtr) malloc(sizeof(Node));if (pNode ==NULL) {

perror("malloc");

exit(1);

}

pNode->elem =x;

pNode->next =NULL;returnpNode;

}

NodePtr insertAfterNode(const NodePtr where,

ElemType x, ForwardList lst)

{

NodePtr pNode=createNode(x);if (where ==NULL) {*lst =pNode;

}else{

pNode->next = where->next;where->next =pNode;

}returnpNode;

}voidshowList(ForwardList lst)

{

printf("显示链表:");

NodePtr curr= *lst;while (curr->next !=NULL) {

printf("%d->", curr->elem);

curr= curr->next;

}

printf("%d", curr->elem);

}voiddestroyList(ForwardList lst)

{

printf("销毁链表:");

NodePtr curr= *lst;while (curr !=NULL) {

NodePtr next= curr->next;

printf("%d", curr->elem);free(curr);

curr=next;

}

printf("");

}

/*测试代码*/

intmain()

{

NodePtr head=NULL;

initListFromStdin(&head);

showList(&head);

destroyList(&head);return 0;

}

三个部分都是写在一份代码里(forward_list.c)的,测试结果如下

$ lsdata.inforward_list.c

$cat data.in

1 2 5 3 4$gcc forward_list.c -std=c99

$ ./a.out 2->5->3->4销毁链表:1 2 5 3 4

由于是不需要考虑周全的C代码,所以很多C++的一些工程性的技巧不需考虑,比如模板、const,说起来之前没把C代码封装成函数的时候就曾经导致链表的头节点被修改,最后销毁链表时,遍历后头节点直接指向了最后一个节点,导致前4个节点都没被销毁。如果合理地使用const,在编译期就能检查出来。

嘛,其实这么一写下来,C++的forward_list版本也就写出来了,毕竟我的链表插入函数就是模仿forward_list的,但是写出来有点别扭。因为需要遍历到倒数第2个节点停止,最后代码如下

#include

#include

using namespace std;

// 取得前向迭代器it的下一个迭代器

template

FwIter nextIter(FwIter it)

{

return ++it;

}

int main()

{

forward_list lst;

int x;

for (auto it = lst.before_begin();

fscanf(stdin, "%d", &x) == 1;

)

{

it = lst.emplace_after(it, x);

}

// 按照a0->a1->...->an的格式输出

auto it = lst.begin();

while (nextIter(it) != lst.end())

{

printf("%d->", *it++);

}

printf("%d

", *it);

return 0;

}

既然C++不提供next()函数那就只有手写一个,因为迭代器传参数时拷贝了一份,所以nextIter()直接返回++it并不会对原迭代器进行修改,而是修改的原迭代器的拷贝。

注意一点就是,在顺序插入构建链表时需要记录链表最后一个节点,跟我的C代码实现风格一致(好吧其实我本来就是仿STL实现的)。

那么初始值就是before_begin()而不是begin(),因为空链表不存在begin(),确切的说空链表的初始节点为NULL。

测试代码,这里_M_node是glibc++的forward_list迭代器底层实现部分,并不是跨平台代码。迭代器相当于把节点地址进行了一层封装,而_M_node则是节点地址。

#include #include

intmain()

{

std::forward_listlst;

printf("begin()地址: %p", lst.begin()._M_node);

printf("before_begin()地址: %p", lst.before_begin()._M_node);return 0;

}

结果如下:

$ g++ test.cc -std=c++11$ ./a.out

begin()地址: (nil)

before_begin()地址:0x7fffb0896b60

c语言编程切片stl1005无标题,C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码...相关推荐

  1. linux+下c语言编程项目,精通UNIX下C语言编程与项目实践

    cc -I  //include 目录 -L //静态库目录?动态也可以 -l //小写L,接静态库名称?动态也可以 -DXXX='"XXFF"' //-D直接定义宏 -c 只编译 ...

  2. c语言程序设计自学跟谁好,双辽c语言编程学习,双辽学c语言编程哪个好,双辽学c语言编程自学好还是报班好...

    双辽c语言编程学习,双辽学c语言编程哪个好,双辽学c语言编程自学好还是报班好 首页 > 软件 > 双辽c语言编程学习 作者:镀金池   发布时间:2017-12-07 05:48 一个C语 ...

  3. c语言程序设计需要学多久,九江c语言编程学习,九江学c语言编程报班,九江学c语言编程一般要多久才能学会...

    九江c语言编程学习,九江学c语言编程报班,九江学c语言编程一般要多久才能学会 首页 > C语言 > 九江c语言编程学习 作者:镀金池   发布时间:2017-10-18 14:11 据ID ...

  4. c语言编程学多久,丰城c语言编程学习,丰城学c语言编程的学校,丰城学c语言编程一般要多久才能学会...

    丰城c语言编程学习,丰城学c语言编程的学校,丰城学c语言编程一般要多久才能学会 首页 > 软件 > 丰城c语言编程学习 作者:镀金池   发布时间:2018-04-09 16:40 在之后 ...

  5. 成都c语言编程培训机构,成都学c语言编程,成都学c语言编程去哪里,成都学c语言编程需要报培训班吗...

    成都学c语言编程,成都学c语言编程去哪里,成都学c语言编程需要报培训班吗 首页 > 软件 > 成都学c语言编程 作者:镀金池   发布时间:2018-09-28 14:20 近似带有序布局 ...

  6. 汕头c语言培训班,汕头c语言编程学习,汕头学c语言编程哪个好,汕头学c语言编程需要报培训班吗...

    汕头c语言编程学习,汕头学c语言编程哪个好,汕头学c语言编程需要报培训班吗 首页 > C语言 > 汕头c语言编程学习 作者:镀金池   发布时间:2017-10-18 20:12 经历:若 ...

  7. 湛江C语言培训,湛江c语言编程学习,湛江学c语言编程报班,湛江学c语言编程自学好还是报班好...

    湛江c语言编程学习,湛江学c语言编程报班,湛江学c语言编程自学好还是报班好 首页 > C语言 > 湛江c语言编程学习 作者:镀金池   发布时间:2017-10-19 09:51 在Swi ...

  8. sleep函数c语言1002无标题,C语言的sleep函数

    C语言的sleep函数 來源:互聯網  2010-01-21 08:25:31  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: 为何我在VS2005 ...

  9. C语言编程编制职工档案管理程序,C语言课程设计--职工档案及简明信息生成.doc...

    湖南工学院 计算机与信息科学系 C语言课程设计报告 --职工档案及简明信息生成 指导老师:高金华 学生班级:信本0802班 学生姓名及学号:贺玲(15) 黄源(16) 2009年6月12日星期五 一. ...

最新文章

  1. 如何安装树莓派摄像头
  2. 005-算法-分治法
  3. 天津科技大学 物理实验平台使用教程及相关问题
  4. Windows与Linux的主要区别
  5. C语言正函数nosign,C语言标准库函数查询手册.docx
  6. 滴滴披露女司机数据:80后女性过半 24%全年零违章
  7. 点沙成金:英特尔芯片制造全过程揭密
  8. Hyperledger fabric v2.3 通道channel 翻译
  9. Atitit 关于建立知识库体系的方案
  10. 用 Python 可视化分析全球火山分布,发现了这些有趣的现象
  11. 用Java Swing山寨QQ空间的魔法卡片游戏
  12. xshell教育版网盘下载
  13. GBIT51129-2015工业化建筑评价标准
  14. unity 通过摄像机模拟实现小地图
  15. 希尔排序实现与复杂度、稳定性分析
  16. 系统架构设计——伸缩性架构
  17. 台式电脑 在哪找到计算机名,win7电脑的投屏功能在哪?教你找到!
  18. [转]solaris 10 使用手册
  19. Arduino Uno 火焰传感器实验
  20. springboot整合rabbitmq的发布确认,消费者手动返回ack,设置备用队列,以及面试题:rabbitmq确保消息不丢失

热门文章

  1. django的环境搭建(一)
  2. 北京内推 | 微软亚洲研究院MSRA STCA招聘多模态算法实习生
  3. 武汉大学提出软模板SoftProto框架,大幅增强方面词抽取任务
  4. 基于IndRNN的手机传感器动作识别
  5. web 小程序 ch2 第一个小程序
  6. oracle 修改索引的名称,Oracle中查询索引名称,批量修改索引名称语句
  7. SpringBoot 自定义starter 保姆级教程(说明+源码+配置+测试)
  8. JAVA 通过URL 获取页面内容
  9. 南大计算机考研录取,南京大学拟录取名单公示,初试最高446分,推免占比竟高达75%...
  10. 按15分钟取数据_步行15分钟能获得什么?这组数据能告诉你……