线性表之单链表 图解和代码实现
线性表的链接存储结构---单链表
图解:
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;
}
}
线性表之单链表 图解和代码实现相关推荐
- 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16
线性表11|单链表小结:腾讯面试题 让编程改变世界 Change the world by program 静态链表的删除操作 我们的故事还没结束,小C看到小A和2B这样非法的勾当,内心觉得很不爽,一 ...
- C++线性表(单链表)的应用算法(附源码)
C++线性表(单链表)的应用算法 线性表(单链表)的应用算法: 构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表. 运行截图 代码实现 /* 线性表 ...
- 卜若的代码笔记-数据结构系列-第三章:链表-最简单的线性表:单链表
1.一个最简单的线性表 1.1单链表的特征: a.链表无法通过索引获取链表元素,只能从头开始一个一个的后继去找. b.链表无法找到父节点 1.2结构: 1.3 实现 我们来讨论一下它的时间复杂度: 1 ...
- 单链表删除所有值为x的元素_线性表之单链表
单链表 一种以链接方式存储的线性表,适用于频繁增删操作,存储空间不定的情形. 单链表的一个存储结点包含两个域,数据域和指针域.数据域用于存储线性表的一个数据元素,指针域用于指示下一个结点开始的存储地址 ...
- 线性表之单链表基本操作
单链表的定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针. ...
- java单链表输出_数据结构基础------1.线性表之单链表的创建与输出方法(Java版)...
基础知识: 线性表(linear list),是其组成元素间具有线性关系的一种线性结构. 线性表有 ①顺序存储结构(sequential storage structure) 顺序存储结构可以简单的理 ...
- 数据结构-线性表之单链表
文章目录 一:相关概念 (1)什么是链表 (2)链表的优点和缺点 (3)链表的分类 二:实践 (1)准备工作 (2)结构体定义 (3)操作 A:创造头结点(初始化) ①:头结点?头指针? ②:初始化 ...
- 数据结构 2-3-1 线性表的单链表实现
一.概念 线性表除了用顺序表(数组)实现,也可以选择用链表实现,链表由于其使用节点存储的特点,所以在增加删除上更方便一些,但是在具体代码编写的过程,由于会涉及到大量的指针,所以编写起来比数组实现要复杂 ...
- 【数据结构】线性表之单链表
目录 一.链表的概念 1.概念 2.分类 3.重点 二.单链表模拟实现 1.准备 2.头插法 3.尾插法 4.指定下标插入 5.遍历 6.删除第一次出现的元素key 7.删除所有的key 8.双指针删 ...
最新文章
- 皮一皮:前女友竟然说这种话...
- QT各种版本第三方下载地址
- 初看jQuery,比较dojo与jQuery的不同点
- 联想Ideapad 710S-13IKB笔记本安装win10系统不认硬盘解决方法
- 合成模式(Composite Pattern)
- 计算机组成 指令扩展,计算机组成原理课程设计--指令扩展设计.doc
- 数学--数论--随机算法--Pollard Rho 大数分解算法(纯模板带输出)
- 行上下移动_这有一台你迟早要用到的手持式“移动空调”
- 1.C和C++区别,以及const分析(底层const/顶层const)
- 特征图注意力_ICLR2017 | AT_注意力引导的知识蒸馏
- 数据库内容集锦(持续更新)
- MySQL的详细安装教程和配置过程(附安装包)
- JAVA实现文本翻译功能_java实现简单的英文文本单词翻译器功能示例
- Linux下安装字体后刷新字体
- vue+vant移动端入门实现5(仿网易严选)
- STM32---FLASH闪存
- 绕过chrome的弹窗拦截机制
- windows7如何安装python_windows7系统下如何安装python
- tcp图片13包java怎么接收_13. TCP协议中的动态数据传输:应对小数据包
- 加班奖励 python_“加班做了2天的方案,同事用Python半个小时就搞定了?”