线性表之单链表

一、头文件:LinkedList.h

  1. //单链表是用一组任意的存储单元存放线性表的元素,这组单元可以是连续的也可以是不连续的,甚至可以是零散分布在内存中的任意位置。
  2. //单链表头文件
  3. #include<iostream>
  4. using namespace std;
  5. //定义单链表结点-结构体类型
  6. template<class DataType>
  7. struct Node
  8. {
  9.   //数据域,存放该结点的数据
  10.   DataType data;
  11.   //指针域,指向下一个结点
  12.   Node<DataType> *next;
  13. };
  14.  
  15. template<class DataType>
  16. class LinkedList{
  17. public:
  18.   //单链表无参构造器
  19.   LinkedList();
  20.   //单链表有参构造器
  21.   LinkedList(DataType array[], int n);
  22.   LinkedList(int n, DataType array[]);
  23.   //单链表析构函数
  24.   ~LinkedList();
  25.   //获取单链表的长度
  26.   int GetLength();
  27.   //查找单链表指定元素的序号
  28.   int GetLocal(DataType x);
  29.   //获取单链表指序号的元素
  30.   DataType GetElement(int index);
  31.   //单链表中在指定位置插入指定的元素
  32.   void Insert(int index, DataType x);
  33.   //在单链表中删除指定位置的元素
  34.   DataType Delete(int index);
  35.   //按序号输出单链表中的元素
  36.   void PrintLinkedList();
  37.  
  38. private :
  39.   //声明单链表的头指针
  40.   Node<DataType> *first;
  41. };
  42.  
  43. //实现单链表的无参构造函数
  44. template<class DataType>
  45. LinkedList<DataType>::LinkedList()
  46. {
  47.   first = new Node<DataType>;
  48.   first->next = NULL;
  49. }
  50.  
  51. //头插法建立单链表
  52. template<class DataType>
  53. LinkedList<DataType>::LinkedList(int n,DataType array[])
  54. {
  55.   //初始化一个空链表
  56.   first = new Node<DataType>;
  57.   first->next = NULL;
  58.   for (int i = ; i < n; i++)
  59.   {
  60.     //为每一个数组元素都申请新结点
  61.     Node<DataType> *s = new Node<DataType>;
  62.     //数组元素赋值给结点数据域
  63.     s->data = array[i];
  64.     //将结点插入到头结点之前
  65.     s->next = first->next;
  66.     first->next = s;
  67.  
  68.   }
  69. }
  70.  
  71. //尾插法建立单链表
  72. template<class DataType>
  73. LinkedList<DataType>::LinkedList(DataType array[], int n)
  74. {
  75.   //生成头结点
  76.   first = new Node<DataType>;
  77.   //定义尾结点
  78.   Node<DataType> *r = first;
  79.   for (int i = ; i < n; i++)
  80.   {
  81.     //为每一个数组元素申请一个结点
  82.     Node<DataType> *s = new Node<DataType>;
  83.     //把数组元素赋值给结点的数据域
  84.     s->data = array[i];
  85.     //将每一个结点追加到终端结点之后
  86.     r->next = s;
  87.     r = s;
  88.   }
  89.   //尾结点尾NULL
  90.   r->next = NULL;
  91. }
  92.  
  93. //实现单链表的析构函数
  94. template<class DataType>
  95. LinkedList<DataType>::~LinkedList()
  96. {
  97.   //声明工作指针
  98.   Node<DataType> *q;
  99.   while (first != NULL)
  100.   {
  101.     //暂存被释放的结点
  102.     q = first;
  103.     //让头指针指向要释放结点的下一个结点
  104.     first = first->next;
  105.     delete q;
  106.   }
  107. }
  108.  
  109. //实现单链表插入:在指定的位置插入指定的元素
  110. template<class DataType>
  111. void LinkedList<DataType>::Insert(int index, DataType x)
  112. {
  113.   //定义工作指针
  114.   Node<DataType> *p = first->next;
  115.   //定义计数器,初始值为0
  116.   int count = ;
  117.   while (p != NULL &&count < index - )
  118.   {
  119.     //工作指针后移
  120.     p = p->next;
  121.     count ++;
  122.   }
  123.   //找到 index-1 的位置
  124.   if (p == NULL)
  125.   {
  126.     throw "插入的位置有误";
  127.   }
  128.   else
  129.   {
  130.     //申请一个新结点
  131.     Node<DataType> *s;
  132.     s= new Node<DataType>;
  133.     //其数据域为 x
  134.     s->data = x;
  135.     //在新结点的指针域存放工作指针p的指针域
  136.     s->next = p->next;
  137.     //将结点s插入到p结点之后
  138.     p->next = s;
  139.   }
  140. }
  141.  
  142. //实现单链表的按值查找,返回指定元素在单链表中的序号(如不存在,则返回0)
  143. template<class DataType>
  144. int LinkedList<DataType>::GetLocal(DataType x)
  145. {
  146.   //定义工作指针
  147.   Node<DataType> *p = first->next;
  148.   //定义计数器,初始值是1
  149.   int count = ;
  150.   //查找序号所对应的位置
  151.   while (p != NULL)
  152.   {
  153.     if (p->data == x)
  154.     {
  155.       return count;
  156.     }
  157.     //工作指针后移
  158.     p = p->next;
  159.     //计数器加1
  160.     count++;
  161.   }
  162.   //如果找不到该元素,则返回0
  163.   return ;
  164. }
  165.  
  166. //实现单链表按位查找,返回指定位置的元素
  167. template<class DataType>
  168. DataType LinkedList<DataType>::GetElement(int index)
  169. {
  170.   //定义工作指针
  171.   Node<DataType> *p = first->next;
  172.   //定义计数器,初始值是1
  173.   int count = ;
  174.   //查找序号所对应的位置
  175.   while (p != NULL&&count < index)
  176.   {
  177.     //工作指针后移
  178.     p = p->next;
  179.     //计数器加1
  180.     count++;
  181.   }
  182.   //如果找到单链表的末尾,还找不到指定的位置,则抛出异常
  183.   if (p == NULL)
  184.   {
  185.     throw "查找的位置有误";
  186.   }
  187.   else
  188.   {
  189.     //当找到合适的位置时,返回该位置上的元素
  190.     return p->data;
  191.   }
  192.  
  193. }
  194.  
  195. //实现获取单链表的长度
  196. template<class DataType>
  197. int LinkedList<DataType>::GetLength()
  198. {
  199.   //定义计数器,用来计算单链表的长度
  200.   int count = ;
  201.   //定义工作指针
  202.   Node<DataType> *p = first->next;
  203.   while (p != NULL)
  204.   {
  205.     p = p->next;
  206.     count++;
  207.   }
  208.   return count;
  209.  
  210. }
  211.  
  212. //实现单链表的按序号输出元素
  213. template<class DataType>
  214. void LinkedList<DataType>::PrintLinkedList()
  215. {
  216.   //声明工作指针
  217.   Node<DataType> *p;
  218.   //初始化工作指针
  219.   p = first->next;
  220.   while(p != NULL)
  221.   {
  222.     cout << p->data << " ";
  223.     //工作指针向后移动
  224.     p = p->next;
  225.   }
  226.   cout << endl;
  227. }
  228.  
  229. //实现单链表的删除
  230. template<class DataType>
  231. DataType LinkedList<DataType>::Delete(int index)
  232. {
  233.   Node<DataType> *p = first->next;
  234.   int count = ;
  235.   //查找第 index-1 位置结点
  236.   while (p != NULL&&count < index - )
  237.   {
  238.     p = p->next;
  239.     count++;
  240.   }
  241.   //如果能找到
  242.   if (p == NULL || p->next == NULL)
  243.   {
  244.     throw "删除的位置有误";
  245.   }
  246.   else
  247.   {
  248.     Node<DataType> *q = p->next;
  249.     DataType x = q->data;
  250.     p->next = q->next;
  251.     delete q;
  252.     return x;
  253.   }
  254. }

二、测试线性表之单链表的源文件:TestLinkedList.cpp

  1. #include<iostream>
  2. #include "LinkedList.h"
  3. using namespace std;
  4. void show()
  5. {
  6.   cout << "---------------------------------------" << endl;
  7. }
  8. int main()
  9. {
  10.   int array[] = { , , , , , , , , , };
  11.   //声明单链表
  12.   LinkedList<int> linkedList = LinkedList<int>(,array);
  13.   cout << "输出单链表:" << endl;
  14.   linkedList.PrintLinkedList();
  15.   show();
  16.   cout << "单链表的长度:" << linkedList.GetLength() << endl;
  17.   cout << "单链表中第5个元素是:" << linkedList.GetElement() << endl;
  18.   cout << "单链表中元素5的位置是:" << linkedList.GetLocal() << endl;
  19.   show();
  20.   cout << "在单链表的第5个位置上插入元素22" << endl;
  21.   linkedList.Insert(, );
  22.   cout << "输出单链表:" << endl;
  23.   linkedList.PrintLinkedList();
  24.   cout << "单链表的长度:" << linkedList.GetLength() << endl;
  25.   show();
  26.   cout << "删除第5位置的元素" << endl;
  27.   linkedList.Delete();
  28.   cout << "输出单链表:" << endl;
  29.   linkedList.PrintLinkedList();
  30.   cout << "单链表的长度:" << linkedList.GetLength() << endl;
  31.   show();
  32.   return ;
  33. }

三、运行示例结果

线性表之单链表C++实现的更多相关文章

  1. [数据结构 - 第3章] 线性表之单链表(C++实现)

    一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...

  2. 续上文----线性表之单链表(C实现)

    本文绪上文线性表之顺序表(C实现) 本文将继续使用单链表实现线性表的另外一种存储结构.这种使用链表实现的存储结构在内存中是不连续的. C实现代码如下: #include<stdio.h> ...

  3. 【Java】 大话数据结构(2) 线性表之单链表

    本文根据<大话数据结构>一书,实现了Java版的单链表. 每个结点中只包含一个指针域的链表,称为单链表. 单链表的结构如图所示: 单链表与顺序存储结构的对比: 实现程序: package ...

  4. 线性表 (单链表、循环链表-python实现)

    一.线性表 线性表的定义: 线性表是具有相同数据类型的有限数据的序列. 线性表的特点: 出了第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外有且只有一个后继. 线性表是一种逻辑结构,表示元 ...

  5. Java数据结构-线性表之单链表LinkedList

    线性表的链式存储结构,也称之为链式表,链表:链表的存储单元能够连续也能够不连续. 链表中的节点包括数据域和指针域.数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个 ...

  6. [C++]数据结构:线性表之(单)链表

    一 (单)链表 ADT + Status InitList(LinkList &L) 初始化(单)链表 + void printList(LinkList L) 遍历(单)链表 + int L ...

  7. 数据结构(java版)学习笔记(三)——线性表之单链表

    单链表的优点: 长度不固定,可以任意增删. 单链表的缺点: 存储密度小,因为每个数据元素,都需要额外存储一个指向下一元素的指针(双链表则需要两个指针). 要访问特定元素,只能从链表头开始,遍历到该元素 ...

  8. 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】

    本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...

  9. 玩转C线性表和单向链表之Linux双向链表优化

    前言: 这次介绍基本数据结构的线性表和链表,并用C语言进行编写:建议最开始学数据结构时,用C语言:像栈和队列都可以用这两种数据结构来实现. 一.线性表基本介绍 1 概念: 线性表也就是关系户中最简单的 ...

随机推荐

  1. Python文件操作-文件的增删改查

    需求:对文件进行增删改查 由于时间原因,本次代码没有增加任何注释,如有疑问,请联系编辑者:闫龙 其实我也是醉了,看着这些个代码,我脑袋也特么大了,没办法,大神说了,不让用新知识,只可以使用学过的,所以 ...

  2. 【微服务架构】SpringCloud之Ribbon

    一:Ribbon是什么? Ribbon是Netfix发布的开源项目,主要负责客户端的软件负载均衡算法,将Netfix的中间层连接在一起,Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等. ...

  3. [转]ROS(Robot Operating System)常用环境变量介绍

    本文简单介绍ROS系统中常用的环境变量用途及设置方式.ROS系统环境中除了必须配置的环境变量以外,其他的也是十分有用,通过修改变量路径,可以设置ROS系统中log文件存放路径,单元测试结果存放路径等. ...

  4. zookeeper集群查看状态时报错Error contacting service. It is probably not running的一些坑以及解决办法

    最近在搭建mq集群时候需要用到,zookeeper,可是启动的时候显示成功了,查看状态的时候却报错了: 碰到这个问题也是研究好好半天才解决,这里就总结出一个快速解决办法! 首先,必须看日志: 报错信息 ...

  5. ARM Linux 3.x的设备树(Device Tree)【转】

    转自:http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1.  ...

  6. aarch64_g5

    gtkmm24-devel-2.24.5-2.fc26.aarch64.rpm 2017-02-11 18:17 620K fedora Mirroring Project gtkmm24-docs- ...

  7. Python3 item系列

    一.前言 #在python中一切皆对象 ''' 创建了一个dict实例-->dic就是dict的实例对象 我们通过dic['k1']可以得到k1所对应的值 那么我们自定义一个类,可不可以使用对象 ...

  8. scala中“_”的用法

    参见链接 http://blog.csdn.net/i6448038/article/details/50017427

  9. 数据库-mysql管理

    MySQL 管理 启动及关闭 MySQL 服务器 首先,我们需要通过以下命令来检查MySQL服务器是否启动: ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql ...

  10. Java基础83 JSP标签及jsp自定义标签(网页知识)

    1.JSP标签 替代jsp脚本,用于jsp中执行java代码1.1.内置标签:  <jsp:forward></jsp:forward>  相当于:request.getReu ...