线性表的链接存储结构---单链表

图解:

LinkList.h文件

//LinkList.h  声明类LinkList
#ifndef LinkList_H
#define LinkList_H
template <class T>
struct Node
{
T data;
Node<T> *next;  //此处<T>也可以省略
};
template <class T>
class LinkList
{
public:
LinkList( );  //建立只有头结点的空链表
LinkList(T a[ ], int n);  //建立有n个元素的单链表
~LinkList();             //析构函数
int Length();          //求单链表的长度
T Get(int i);           //取单链表中第i个结点的元素值
int Locate(T x);       //求单链表中值为x的元素序号
void Insert(int i, T x);   //在单链表中第i个位置插入元素值为x的结点
T Delete(int i);        //在单链表中删除第i个结点
void PrintList( );           //遍历单链表,按序号依次输出各元素
private:
Node<T> *first;  //单链表的头指针
};
#endif

LinkList.cpp文件

//LinkList.cpp
#include "LinkList.h"
/*
*前置条件:单链表不存在
*输    入:无
*功    能:构建一个单链表
*输    出:无
*后置条件:构建一个单链表
*/
template <class T>
LinkList<T>:: LinkList( )
{
first=new Node<T>; first->next=NULL;
}
/*
*前置条件:单链表不存在
*输    入:顺序表信息的数组形式a[],单链表长度n
*功    能:将数组a[]中元素建为长度为n的单链表
*输    出:无
*后置条件:构建一个单链表
*/
template <class T>
LinkList<T>:: LinkList(T a[ ], int n)
{
first=new Node<T>;   //生成头结点
Node<T> *r,*s;
r=first;          //尾指针初始化
for (int i=0; i<n; i++)
{
s=new Node<T>; s->data=a[i];  //为每个数组元素建立一个结点
r->next=s; r=s;      //插入到终端结点之后
}
r->next=NULL;    //单链表建立完毕,将终端结点的指针域置空
}
/*
*前置条件:无
*输    入:无
*功    能:无
*输    出:无
*后置条件:无
*/
template <class T>
LinkList<T>:: ~LinkList()
{
}
/*
*前置条件:单链表存在
*输    入:查询元素位置i
*功    能:按位查找位置为i的元素并输出值
*输    出:查询元素的值
*后置条件:单链表不变
*/
template <class T>
T LinkList<T>::Get(int i)
{
Node<T> *p; int j;
p=first->next;  j=1;  //或p=first;  j=0;
while (p && j<i)
{
p=p->next;       //工作指针p后移
j++;
}
if (!p) throw "位置";
else return p->data;
}
/*
*前置条件:单链表存在
*输    入:查询元素值x
*功    能:按值查找值的元素并输出位置
*输    出:查询元素的位置
*后置条件:单链表不变
*/
template <class T>
int LinkList<T>::Locate(T x)
{
Node<T> *p; int j;
p=first->next; j=1;
if(p&&p->next){
while(p->data!=x)
{
p=p->next;
j++;
}
return j;
}
else throw "位置";
}
/*
*前置条件:单链表存在
*输    入:插入元素x,插入位置i
*功    能:将元素x插入到单链表中位置i处
*输    出:无
*后置条件:单链表插入新元素
*/
template <class T>
void LinkList<T>::Insert(int i, T x)
{
Node<T> *p; int j;
p=first ; j=0;    //工作指针p初始化
while (p && j<i-1)
{
p=p->next;   //工作指针p后移
j++;
}
if (!p) throw "位置";
else {
Node<T> *s;
s=new Node<T>;
s->data=x;  //向内存申请一个结点s,其数据域为x
s->next=p->next;       //将结点s插入到结点p之后
p->next=s;
}
}
/*
*前置条件:单链表存在
*输    入:无
*功    能:输出单链表长度
*输    出:单链表长度
*后置条件:单链表不变
*/
template <class T>
int LinkList<T>::Length( )
{
Node <T> *p = first->next;
int i = 0;
while(p)
{
p = p->next;
i++;
}
return i;
}
/*
*前置条件:单链表存在
*输    入:要删除元素位置i
*功    能:删除单链表中位置为i的元素
*输    出:无
*后置条件:单链表删除元素
*/
template <class T>
T LinkList<T>::Delete(int i)
{
Node<T> *p; int j;
p=first ; j=0;  //工作指针p初始化
while (p && j<i-1)  //查找第i-1个结点
{
p=p->next;
j++;
}
if (!p || !p->next) throw "位置";  //结点p不存在或结点p的后继结点不存在
else {
Node<T> *q; int x;
q=p->next; x=q->data;  //暂存被删结点
p->next=q->next;  //摘链
delete q;
return x;
}
}
/*
*前置条件:单链表存在
*输    入:无
*功    能:单链表遍历
*输    出:输出所有元素
*后置条件:单链表不变
*/
template <class T>
void LinkList<T>::PrintList( )
{
Node<T> *p;
p=first->next;
while (p)
{
cout<<p->data<<endl;
p=p->next;
}
}

线性表之单链表 图解和代码实现相关推荐

  1. 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16

    线性表11|单链表小结:腾讯面试题 让编程改变世界 Change the world by program 静态链表的删除操作 我们的故事还没结束,小C看到小A和2B这样非法的勾当,内心觉得很不爽,一 ...

  2. C++线性表(单链表)的应用算法(附源码)

    C++线性表(单链表)的应用算法 线性表(单链表)的应用算法: 构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表. 运行截图 代码实现 /* 线性表 ...

  3. 卜若的代码笔记-数据结构系列-第三章:链表-最简单的线性表:单链表

    1.一个最简单的线性表 1.1单链表的特征: a.链表无法通过索引获取链表元素,只能从头开始一个一个的后继去找. b.链表无法找到父节点 1.2结构: 1.3 实现 我们来讨论一下它的时间复杂度: 1 ...

  4. 单链表删除所有值为x的元素_线性表之单链表

    单链表 一种以链接方式存储的线性表,适用于频繁增删操作,存储空间不定的情形. 单链表的一个存储结点包含两个域,数据域和指针域.数据域用于存储线性表的一个数据元素,指针域用于指示下一个结点开始的存储地址 ...

  5. 线性表之单链表基本操作

    单链表的定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针. ...

  6. java单链表输出_数据结构基础------1.线性表之单链表的创建与输出方法(Java版)...

    基础知识: 线性表(linear list),是其组成元素间具有线性关系的一种线性结构. 线性表有 ①顺序存储结构(sequential storage structure) 顺序存储结构可以简单的理 ...

  7. 数据结构-线性表之单链表

    文章目录 一:相关概念 (1)什么是链表 (2)链表的优点和缺点 (3)链表的分类 二:实践 (1)准备工作 (2)结构体定义 (3)操作 A:创造头结点(初始化) ①:头结点?头指针? ②:初始化 ...

  8. 数据结构 2-3-1 线性表的单链表实现

    一.概念 线性表除了用顺序表(数组)实现,也可以选择用链表实现,链表由于其使用节点存储的特点,所以在增加删除上更方便一些,但是在具体代码编写的过程,由于会涉及到大量的指针,所以编写起来比数组实现要复杂 ...

  9. 【数据结构】线性表之单链表

    目录 一.链表的概念 1.概念 2.分类 3.重点 二.单链表模拟实现 1.准备 2.头插法 3.尾插法 4.指定下标插入 5.遍历 6.删除第一次出现的元素key 7.删除所有的key 8.双指针删 ...

最新文章

  1. 皮一皮:前女友竟然说这种话...
  2. QT各种版本第三方下载地址
  3. 初看jQuery,比较dojo与jQuery的不同点
  4. 联想Ideapad 710S-13IKB笔记本安装win10系统不认硬盘解决方法
  5. 合成模式(Composite Pattern)
  6. 计算机组成 指令扩展,计算机组成原理课程设计--指令扩展设计.doc
  7. 数学--数论--随机算法--Pollard Rho 大数分解算法(纯模板带输出)
  8. 行上下移动_这有一台你迟早要用到的手持式“移动空调”
  9. 1.C和C++区别,以及const分析(底层const/顶层const)
  10. 特征图注意力_ICLR2017 | AT_注意力引导的知识蒸馏
  11. 数据库内容集锦(持续更新)
  12. MySQL的详细安装教程和配置过程(附安装包)
  13. JAVA实现文本翻译功能_java实现简单的英文文本单词翻译器功能示例
  14. Linux下安装字体后刷新字体
  15. vue+vant移动端入门实现5(仿网易严选)
  16. STM32---FLASH闪存
  17. 绕过chrome的弹窗拦截机制
  18. windows7如何安装python_windows7系统下如何安装python
  19. tcp图片13包java怎么接收_13. TCP协议中的动态数据传输:应对小数据包
  20. 加班奖励 python_“加班做了2天的方案,同事用Python半个小时就搞定了?”

热门文章

  1. k8s集群calico-node CrashLoopBackOff
  2. Kylin-Server-V10 ARM64与LoongArch64 PXE无人值守安装
  3. 简单分账系统的分账能力有多强?
  4. JS对象转换为Number/String的内部原理 JS在浏览器中的运行环境
  5. ats 与 https
  6. 记录小白通过TCP/IP协议实现远程操作机械手臂
  7. Shiro的简介(一)
  8. win7计算机没有显示移动硬盘,win7电脑不认移动硬盘该怎么办
  9. MS2109 HDMI转USB 高清视频传输方案
  10. vs2013 串口通讯