------------恢复内容开始------------

  1. #include<iostream>
  2. using namespace::std;
  3.  
  4. typedef int ElemType;
  5. struct Node
  6. {
  7. ElemType data;
  8. Node* next;
  9. };
  10.  
  11. class LinkList
  12. {
  13. private:
  14. Node* Head;
  15. public:
  16. LinkList()
  17. {
  18. Head = new Node();
  19. }
  20. ~LinkList() {
  21. Node* p;
  22. p = Head->next;
  23. while (p)
  24. {
  25. ListDelete();
  26. p = p->next;
  27. }
  28.  
  29. };
  30. void CreateList_headInsert(int n) //头插入法创建有n个节点的线性表
  31. {
  32. Node* headNode, * newNode; //这里的 headNode 与 Head 不同,Head是为了使逻辑 0 位置存放表头,而 headNode 则是记录当前最后一个节点
  33. headNode = Head;
  34. cout << "请输入" << n << "个数据元素:" << endl;
  35. for (int i = ; i < n; i++)
  36. {
  37. newNode = new Node();
  38. cin >> newNode->data; //输入新节点的数据信息
  39. headNode->next = newNode->next; //将新节点插入原表头之前
  40. headNode->next = newNode; //新的表头是 p 节点
  41. }
  42. }
  43.  
  44. void CreateList_tailInsert(int n) //尾插入法创建有n个节点的线性表
  45. {
  46. Node* headNode, * newNode; //这里的 headNode 与 Head 不同,Head是为了使逻辑 0 位置存放表头,而 headNode 则是记录当前最后一个节点
  47. headNode = Head;
  48. cout << "请输入" << n << "个数据元素:" << endl;
  49. for (int i = ; i < n; i++)
  50. {
  51. newNode = new Node();
  52. cin >> newNode->data;
  53. headNode->next = newNode;
  54. headNode = newNode;
  55. }
  56. }
  57.  
  58. void ListInsert(int i, int e) //在表中i位置插入e
  59. {
  60. int j = ;
  61. Node* p; // p 用来记录当前指针指向的节点
  62. p = Head;
  63. while (j < i - )
  64. {
  65. p = p->next;
  66. j++;
  67. }
  68. if (!p || j > i - ) // !p 表示 i 大于表长, j > i-1 表示 i < 0
  69. {
  70. cout << "位置异常,节点插入失败!" << endl;
  71. return;
  72. }
  73. else
  74. {
  75. Node* newNode = new Node(); // newNode 指要插入的新节点
  76. newNode->data = e;
  77. newNode->next = p->next;
  78. p->next = newNode;
  79. }
  80. }
  81.  
  82. void ListDelete(int i) //删除表中i位置上的元素
  83. {
  84. int j = ;
  85. Node* p; // p 用来记录当前指针指向的节点
  86. p = Head;
  87. while (j < i - )
  88. {
  89. p = p->next;
  90. j++;
  91. }
  92. if (!p || j > i - ) // !p 表示 i 大于表长, j > i-1 表示 i < 0
  93. {
  94. cout << "位置异常,节点删除失败!" << endl;
  95. return ;
  96. }
  97. else
  98. {
  99. p->next = p->next->next;
  100. cout << "删除节点成功" << endl;
  101. }
  102. }
  103.  
  104. void GetElem(int i) //获取第i个位置上的元素
  105. {
  106. int j = ;
  107. Node* p; // p 用来记录当前指针指向的节点
  108. p = Head;
  109. while (j < i)
  110. {
  111. p = p->next;
  112. j++;
  113. }
  114. cout << "第" << i << "个元素为" << p->data << endl;
  115. }
  116.  
  117. int LocateElem(int e) //在链表中查找是否存在元素e,若存在则返回位置,否则返回-1
  118. {
  119. int j = ;
  120. Node* p; // p 用来记录当前指针指向的节点
  121. p = Head->next;
  122. while (p->data != e && p)
  123. {
  124. p = p->next;
  125. j++;
  126. }
  127. if (p == NULL)
  128. {
  129. return -;
  130. }
  131. else
  132. {
  133. return j;
  134. }
  135. }
  136.  
  137. void Listlength() //计算表长
  138. {
  139. int j = ;
  140. Node* p = new Node(); // p 用来记录当前指针指向的节点
  141. p = Head->next;
  142. while (p)
  143. {
  144. if (p->next==NULL)
  145. break;
  146. p = p->next;
  147. j++;
  148. }
  149. cout << "链表长度为:" << j << endl;
  150. }
  151. void TravelList() //遍历整张链表
  152. {
  153. int j = ;
  154. Node* p = new Node(); // p 用来记录当前指针指向的节点
  155. p = Head->next;
  156. while (p)
  157. {
  158. cout << "第 " << j << " 个元素:" << p->data << endl;
  159. p = p->next;
  160. j++;
  161. }
  162. }
  163. };
  164.  
  165. int main()
  166. {
  167. LinkList L ;
  168. int i;
  169. cout << "请输入想要创建链表的节点个数:" << endl;
  170. cin >> i;
  171. L.CreateList_tailInsert(i);
  172. L.Listlength();
  173. L.TravelList();
  174. L.ListInsert(, );
  175. L.GetElem();
  176. return ;
  177. }

人狠话不多直接上代码先。单链表与线性表相对,是数据存储的两大方式。链表虽然摒弃了线性表可以随机存储以及易于求得表长的优点,但是他插入、删除节点更加快速,对内存的利用率更高(不必硬性要求开辟一块连续长度的内存空间)。

单链表实现的功能主要如下:

  1. #include<iostream>
  2. using namespace::std;
  3.  
  4. typedef int ElemType;
  5. struct Node
  6. {
  7. ElemType data;
  8. Node* next;
  9. };
  10.  
  11. class LinkList
  12. {
  13. private:
  14. Node* Head;
  15. public:
  16. LinkList()
  17. {
  18. Head = new Node();
  19. }
  20. ~LinkList() {
  21.  
  22. };
  23. void CreateList_headInsert(int n) //头插入法创建有n个节点的线性表
  24. {
  25.  
  26. }
  27.  
  28. void CreateList_tailInsert(int n) //尾插入法创建有n个节点的线性表
  29. {
  30.  
  31. }
  32.  
  33. void ListDelete(int i) //删除表中i位置上的元素
  34. {
  35.  
  36. }
  37.  
  38. void GetElem(int i) //获取第i个位置上的元素
  39. {
  40.  
  41. }
  42.  
  43. int LocateElem(int e) //在链表中查找是否存在元素e,若存在则返回位置,否则返回-1
  44. {
  45.  
  46. }
  47.  
  48. void Listlength() //计算表长
  49. {
  50.  
  51. }
  52. void TravelList() //遍历整张链表
  53. {
  54.  
  55. }
  56. };

其中建立链表时插入节点方式有两种,一种是头插法,一种是尾插法。

头插法:

例如链表中现在有三个元素  a -> b -> c ,新的节点 d 需要插入,则应该让 d -> next = a; 之后 d 变成新的表头,即 headNode = d;  //headNode始终表示链表的第一个节点

尾插法:

同样的,例如链表中现在有三个元素  a -> b -> c ,新的节点 d 需要插入,则应该让 c -> next = d; 之后 d 变成新的表尾,即 p = d;  //p 始终表示链表最后一个节点

其中需要注意的一点是(可能我C++习惯还没养成,欠缺熟练度)在使用 Node* p = new Node();时,我开始没加(),导致每次运行都显示堆栈溢出,这里强调一下,new后面的一定要加()【但是看的那本书没有加   ---数据结构与算法分析{人民邮电出版社},书山的是在VC6.0环境下运行的,而我用的时VS2019,也没有弄明白,还请大神把个忙解释一下】  

不足之处欢迎大家指正哈!

VS环境下基于C++的单链表实现的更多相关文章

  1. .NET环境下基于RBAC的访问控制

    .NET环境下基于RBAC的访问控制 Access Control of Application Based on RBAC model in .NET Environment 摘 要:本文从目前信息 ...

  2. 【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集

    版本:第一版作者:周新稳 杨帅 日期:20160226 =========================== 本资料高清PDF 下载: http://pan.baidu.com/s/1c1uuhLQ ...

  3. Windows 环境下基于 nginx 的本地 PyPI 源

    Windows 环境下基于 nginx 的本地 PyPI 源的搭建: 1.登录 nginx 官网,下载安装包

  4. eclipse环境下基于已构建struts2项目整合spring+hibernate

    本文是基于已构建的struts2项目基础上整合 spring+hibernate,若读者还不熟悉struts2项目,请先阅读 eclipse环境下基于tomcat-7.0.82构建struts2项目 ...

  5. 【应用笔记】【AN005】Qt开发环境下基于RS485的4-20mA电流采集

    简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍在Qt开发环境下基于RS485实现4-20mA电流采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成 ...

  6. CentOS 环境下基于 Nginx uwsgi 搭建 Django 站点

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,CentOS 环境下基于 Nginx uwsgi 搭建 Django 站点 以下 ...

  7. 【应用笔记】【AN003】VC++环境下基于以太网的4-20mA电流采集

    简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC++环境下进行温度采集,实现WINDOWS平台对数据的采集.分析及显示 ...

  8. 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)

    版本:第一版 作者:毛鹏 杨帅 日期:20151108 简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC#环境下进行温 ...

  9. [Done]SnowFlake 分布式环境下基于ZK构WorkId

    Twitter 的 Snowflake  大家应该都熟悉的,先上个图: 时间戳 序列号一般不会去改造,主要是工作机器id,大家会进行相关改造,我厂对工作机器进行了如下改造(估计大家都差不多吧,囧~~~ ...

随机推荐

  1. httpd2.4

    更换网站主页目录 1.在httpd.conf文件中更改documentroot为新的路径,并为其相应的路径给与相应的权限. Documentroot "/www/http" < ...

  2. 快学Scala 第三课 (定长数组,变长数组, 数组循环, 数组转换, 数组常用操作)

    定长数组定义: val ar = new Array[Int](10) val arr = Array("aa", "bb") 定长数组赋值: arr(0) = ...

  3. Github | 吴恩达新书《Machine Learning Yearning》完整中文版开源

    最近开源了周志华老师的西瓜书<机器学习>纯手推笔记: 博士笔记 | 周志华<机器学习>手推笔记第一章思维导图 [博士笔记 | 周志华<机器学习>手推笔记第二章&qu ...

  4. 智慧金融时代,大数据和AI如何为业务赋能

    前言:宜信技术人物专访是宜信技术学院推出的系列性专题,我们邀请软件研发行业的优秀技术人,分享自己在软件研发领域的实践经验和前瞻性观点. 第一期专访我们邀请到宜信科技中心AI中台负责人王东老师,从大数据 ...

  5. 数据的异构实战(一) 基于canal进行日志的订阅和转换

    什么是数据的异构处理.简单说就是为了满足我们业务的扩展性,将数据从某种特定的格式转换到新的数据格式中来. 为什么会有这种需求出现呢? 传统的企业中,主要都是将数据存储在了关系型数据库中,例如说MySQ ...

  6. jsonp与cors跨域解析

    1.浏览器的同源安全策略 没错,就是这家伙干的,浏览器只允许请求当前域的资源,而对其他域的资源表示不信任.那怎么才算跨域呢? 请求协议http,https的不同 域domain的不同 端口port的不 ...

  7. 在vue中操作dom元素

    在vue中可以通过给标签加ref属性,就可以在js中利用ref去引用它,从而达到操作该dom元素,以下是个参考例子 1 <template> 2 <div> 3 <div ...

  8. TensorFlow2.0(7):激活函数

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  9. unittest介绍

    unittest框架是python中一个标准的库中的一个模块,该模块包括许多的类如 test case类.test suit类.texttest runner类.texttest resuite类.t ...

  10. Python_生成随机验证码

    内置函数 chr() ord() 这两个内置函数是用来对十进制(十六进制也可以)与ASCii之间进行转换 chr() : 将十进制转换成ASCii对应字母或符号 t_1 = chr(99) t_2 = ...