线性表之单链表C++实现
线性表之单链表
一、头文件:LinkedList.h
//单链表是用一组任意的存储单元存放线性表的元素,这组单元可以是连续的也可以是不连续的,甚至可以是零散分布在内存中的任意位置。
//单链表头文件
#include<iostream>
using namespace std;
//定义单链表结点-结构体类型
template<class DataType>
struct Node
{
//数据域,存放该结点的数据
DataType data;
//指针域,指向下一个结点
Node<DataType> *next;
}; template<class DataType>
class LinkedList{
public:
//单链表无参构造器
LinkedList();
//单链表有参构造器
LinkedList(DataType array[], int n);
LinkedList(int n, DataType array[]);
//单链表析构函数
~LinkedList();
//获取单链表的长度
int GetLength();
//查找单链表指定元素的序号
int GetLocal(DataType x);
//获取单链表指序号的元素
DataType GetElement(int index);
//单链表中在指定位置插入指定的元素
void Insert(int index, DataType x);
//在单链表中删除指定位置的元素
DataType Delete(int index);
//按序号输出单链表中的元素
void PrintLinkedList(); private :
//声明单链表的头指针
Node<DataType> *first;
}; //实现单链表的无参构造函数
template<class DataType>
LinkedList<DataType>::LinkedList()
{
first = new Node<DataType>;
first->next = NULL;
} //头插法建立单链表
template<class DataType>
LinkedList<DataType>::LinkedList(int n,DataType array[])
{
//初始化一个空链表
first = new Node<DataType>;
first->next = NULL;
for (int i = ; i < n; i++)
{
//为每一个数组元素都申请新结点
Node<DataType> *s = new Node<DataType>;
//数组元素赋值给结点数据域
s->data = array[i];
//将结点插入到头结点之前
s->next = first->next;
first->next = s; }
} //尾插法建立单链表
template<class DataType>
LinkedList<DataType>::LinkedList(DataType array[], int n)
{
//生成头结点
first = new Node<DataType>;
//定义尾结点
Node<DataType> *r = first;
for (int i = ; i < n; i++)
{
//为每一个数组元素申请一个结点
Node<DataType> *s = new Node<DataType>;
//把数组元素赋值给结点的数据域
s->data = array[i];
//将每一个结点追加到终端结点之后
r->next = s;
r = s;
}
//尾结点尾NULL
r->next = NULL;
} //实现单链表的析构函数
template<class DataType>
LinkedList<DataType>::~LinkedList()
{
//声明工作指针
Node<DataType> *q;
while (first != NULL)
{
//暂存被释放的结点
q = first;
//让头指针指向要释放结点的下一个结点
first = first->next;
delete q;
}
} //实现单链表插入:在指定的位置插入指定的元素
template<class DataType>
void LinkedList<DataType>::Insert(int index, DataType x)
{
//定义工作指针
Node<DataType> *p = first->next;
//定义计数器,初始值为0
int count = ;
while (p != NULL &&count < index - )
{
//工作指针后移
p = p->next;
count ++;
}
//找到 index-1 的位置
if (p == NULL)
{
throw "插入的位置有误";
}
else
{
//申请一个新结点
Node<DataType> *s;
s= new Node<DataType>;
//其数据域为 x
s->data = x;
//在新结点的指针域存放工作指针p的指针域
s->next = p->next;
//将结点s插入到p结点之后
p->next = s;
}
} //实现单链表的按值查找,返回指定元素在单链表中的序号(如不存在,则返回0)
template<class DataType>
int LinkedList<DataType>::GetLocal(DataType x)
{
//定义工作指针
Node<DataType> *p = first->next;
//定义计数器,初始值是1
int count = ;
//查找序号所对应的位置
while (p != NULL)
{
if (p->data == x)
{
return count;
}
//工作指针后移
p = p->next;
//计数器加1
count++;
}
//如果找不到该元素,则返回0
return ;
} //实现单链表按位查找,返回指定位置的元素
template<class DataType>
DataType LinkedList<DataType>::GetElement(int index)
{
//定义工作指针
Node<DataType> *p = first->next;
//定义计数器,初始值是1
int count = ;
//查找序号所对应的位置
while (p != NULL&&count < index)
{
//工作指针后移
p = p->next;
//计数器加1
count++;
}
//如果找到单链表的末尾,还找不到指定的位置,则抛出异常
if (p == NULL)
{
throw "查找的位置有误";
}
else
{
//当找到合适的位置时,返回该位置上的元素
return p->data;
} } //实现获取单链表的长度
template<class DataType>
int LinkedList<DataType>::GetLength()
{
//定义计数器,用来计算单链表的长度
int count = ;
//定义工作指针
Node<DataType> *p = first->next;
while (p != NULL)
{
p = p->next;
count++;
}
return count; } //实现单链表的按序号输出元素
template<class DataType>
void LinkedList<DataType>::PrintLinkedList()
{
//声明工作指针
Node<DataType> *p;
//初始化工作指针
p = first->next;
while(p != NULL)
{
cout << p->data << " ";
//工作指针向后移动
p = p->next;
}
cout << endl;
} //实现单链表的删除
template<class DataType>
DataType LinkedList<DataType>::Delete(int index)
{
Node<DataType> *p = first->next;
int count = ;
//查找第 index-1 位置结点
while (p != NULL&&count < index - )
{
p = p->next;
count++;
}
//如果能找到
if (p == NULL || p->next == NULL)
{
throw "删除的位置有误";
}
else
{
Node<DataType> *q = p->next;
DataType x = q->data;
p->next = q->next;
delete q;
return x;
}
}
二、测试线性表之单链表的源文件:TestLinkedList.cpp
#include<iostream>
#include "LinkedList.h"
using namespace std;
void show()
{
cout << "---------------------------------------" << endl;
}
int main()
{
int array[] = { , , , , , , , , , };
//声明单链表
LinkedList<int> linkedList = LinkedList<int>(,array);
cout << "输出单链表:" << endl;
linkedList.PrintLinkedList();
show();
cout << "单链表的长度:" << linkedList.GetLength() << endl;
cout << "单链表中第5个元素是:" << linkedList.GetElement() << endl;
cout << "单链表中元素5的位置是:" << linkedList.GetLocal() << endl;
show();
cout << "在单链表的第5个位置上插入元素22" << endl;
linkedList.Insert(, );
cout << "输出单链表:" << endl;
linkedList.PrintLinkedList();
cout << "单链表的长度:" << linkedList.GetLength() << endl;
show();
cout << "删除第5位置的元素" << endl;
linkedList.Delete();
cout << "输出单链表:" << endl;
linkedList.PrintLinkedList();
cout << "单链表的长度:" << linkedList.GetLength() << endl;
show();
return ;
}
三、运行示例结果

线性表之单链表C++实现的更多相关文章
- [数据结构 - 第3章] 线性表之单链表(C++实现)
一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...
- 续上文----线性表之单链表(C实现)
本文绪上文线性表之顺序表(C实现) 本文将继续使用单链表实现线性表的另外一种存储结构.这种使用链表实现的存储结构在内存中是不连续的. C实现代码如下: #include<stdio.h> ...
- 【Java】 大话数据结构(2) 线性表之单链表
本文根据<大话数据结构>一书,实现了Java版的单链表. 每个结点中只包含一个指针域的链表,称为单链表. 单链表的结构如图所示: 单链表与顺序存储结构的对比: 实现程序: package ...
- 线性表 (单链表、循环链表-python实现)
一.线性表 线性表的定义: 线性表是具有相同数据类型的有限数据的序列. 线性表的特点: 出了第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外有且只有一个后继. 线性表是一种逻辑结构,表示元 ...
- Java数据结构-线性表之单链表LinkedList
线性表的链式存储结构,也称之为链式表,链表:链表的存储单元能够连续也能够不连续. 链表中的节点包括数据域和指针域.数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个 ...
- [C++]数据结构:线性表之(单)链表
一 (单)链表 ADT + Status InitList(LinkList &L) 初始化(单)链表 + void printList(LinkList L) 遍历(单)链表 + int L ...
- 数据结构(java版)学习笔记(三)——线性表之单链表
单链表的优点: 长度不固定,可以任意增删. 单链表的缺点: 存储密度小,因为每个数据元素,都需要额外存储一个指向下一元素的指针(双链表则需要两个指针). 要访问特定元素,只能从链表头开始,遍历到该元素 ...
- 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】
本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...
- 玩转C线性表和单向链表之Linux双向链表优化
前言: 这次介绍基本数据结构的线性表和链表,并用C语言进行编写:建议最开始学数据结构时,用C语言:像栈和队列都可以用这两种数据结构来实现. 一.线性表基本介绍 1 概念: 线性表也就是关系户中最简单的 ...
随机推荐
- 49、多线程创建的三种方式之继承Thread类
继承Thread类创建线程 在java里面,开发者可以创建线程,这样在程序执行过程中,如果CPU空闲了,就会执行线程中的内容. 使用Thread创建线程的步骤: 1.自定义一个类,继承java.lan ...
- linux源码安装nginx
任务目标:源码安装nginx,作为web服务修改配置文件,让配置生效,验证配置 首先要去官网nginx.org下载一个tar包: tar xvf 解包 进入到解包出来的目录,对configure进行配 ...
- D. Sum in the tree(树形+贪心)
题目链接;http://codeforces.com/contest/1099/problem/D 题目大意:给出一棵树,每个节点到根节点的路径上经过的所有点的权值之和,其深度为偶数的节点的信息全部擦 ...
- 对web标准的理解,以及对w3c组织的认识
(1)web标准规范要求,书写标签必须闭合.标签小写.不乱嵌套,可提高搜索机器人对网页内容的搜索几率.--- SEO(2)建议使用外链css和js脚本,从而达到结构与行为.结构与表现的分离,提高页面的 ...
- Spring编程式和声明式事务实例讲解
Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 历史回顾: 可能是最漂亮的Spring事务管理详解 Spring事务管理 S ...
- poj1077
题意:给出一个八数码问题,求解法,不可解则输出unsolvable. 分析:可以用ida*算法,估价函数可以使用每个数码到其最终位置的最短距离之和.对于不可解的判断,我这里用迭代深度大于100时判定为 ...
- MongoDB安全:创建角色(User-Defined Roles)
MongoDB已经定义了一些内建角色,同时还提供了用户自定义角色的功能,以满足用户千差万别的需求. 官文User-Defined Roles中对其有简略介绍,但要熟悉怎么创建角色,还需要了解下面的这些 ...
- dedecms调用文章列表第一篇和下面几篇不同的方法
{dede:arclist row=1 orderby=pubdate infolen=60 limit=0,1} <li class="dot1"><img s ...
- Java 中 日期 时间 加减
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //方法1(推荐,功能强大灵活多变) Ca ...
- xcode7 创建pch文件
1.打开xcode 7.2 项目,在屏幕顶端的工具栏,选择File>New>File..>iOS>Other>PCH File,点击"next"下一步 ...