C++实现线性表的链接存储结构(单链表)
将线性表的抽象数据类型定义在链接存储结构下用C++的类实现,由于线性表的数据元素类型不确定,所以采用模板机制。
头文件linklist.h
#pragma once
#include <iostream>
// 单链表的节点
template<class T>
struct Node
{
T data;//数据域
Node<T> *next;// 指针域,指向后继节点
};
// 单链表的类实现
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;// 单链表的头节点
}; template<class T>
inline LinkList<T>::LinkList()
{
first = new Node<T>; // 生成头节点
first->next = NULL; // 头节点指针域为空
} // 头插法建立单链表
template<class T>
LinkList<T>::LinkList(T a[], int n)
{
first = new Node<T>;
first->next = NULL; // 初始化一个空链表
for (int i = ; i < n; i++)
{
Node<T>* S = new Node<T>;
S->data = a[i]; // 为每个数据元素建立一个节点
S->next = first->next;
first->next = S; // 将节点S插入头节点之后
}
}
// 尾插法建立单链表
template<class T>
LinkList<T>::LinkList(T a[], int n)
{
first = new Node<T>;// 建立头节点
first->next = NULL;
Node<T>* r = first;// 尾指针初始化
for(int i = ; i < n; i++)
{
Node<T>* S = new Node<T>;
S->data = a[i]; // 为每个数据元素建立一个节点
r->next = S;
r = S; // 插入节点S,并将尾指针指向S节点
}
r->next = NULL; // 单链表建立完毕之后,将尾指针置空
} template<class T>
LinkList<T>::~LinkList()
{
while (first != NULL)
{
Node<T>* p = first; // 暂存将被释放节点
first = first->next; // 指向下一个节点
delete p;
}
} template<class T>
int LinkList<T>::Length()
{
int count = ; // 计数
Node<T>* p = first->next; // 将工作指针指向第一个节点
while (p != NULL)
{
count++;
p = p->next;
}
return count;
} template<class T>
T LinkList<T>::Get(int i)
{
int count = ; // 计数
Node<T>* p = first->next; // 将工作指针指向第一个节点
while (p != NULL)
{
count++;
if (count == i)
return p->data;
p = p->next;
}
return -; // 越界
} template<class T>
int LinkList<T>::Locate(T x)
{
int count = ; // 计数
Node<T>* p = first->next; // 将工作指针指向第一个节点
while (p != NULL)
{
count++;
if (p->data == x)
return count;
p = p->next;
}
return ; // 查找失败
} template<class T>
void LinkList<T>::Insert(int i, T x)
{
int count = ; // 计数
Node<T>* p = first; // 将工作指针指向头节点
while (p != NULL)
{
if (count == i - ) // 找第i-1个节点
{
Node<T>* S = new Node<T>;
S->data = x;
S->next = p->next;
p->next = S;
}
p = p->next;
count++;
}
if (p == NULL)
throw "位置越界";
} template<class T>
T LinkList<T>::Delete(int i)
{
int count = ; // 计数
Node<T>* p = first; // 将工作指针指向头节点
while (p != NULL)
{
if (count == i - )
{
Node<T>* q = p->next;// 暂存被删节点
T x = q->data;
p->next = q->next;
delete q;
return x;
}
p = p->next;
count++;
}
return -;
} template<class T>
void LinkList<T>::PrintList()
{
Node<T>* p = first->next; // 将工作指针指向第一个节点
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
主函数
#include"linklist.h"
using namespace std; int main()
{
int arry[] = { , , , , , , , , , };
LinkList<int>* linklist = new LinkList<int>(arry, );
cout << linklist->Length() << endl;
cout << linklist->Get() << endl;
cout << linklist->Locate() << endl;
linklist->Insert(, );
linklist->Delete();
linklist->PrintList(); system("pause");
return ;
}
运行结果如下:

C++实现线性表的链接存储结构(单链表)的更多相关文章
- 数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析
#include<stdio.h>#include<stdlib.h>//线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初 ...
- 数据结构C语言实现系列——线性表(线性表链接存储(单链表))
#include <stdio.h>#include <stdlib.h>#define NN 12#define MM 20typedef int elemType ;/** ...
- Atitit.数据库表的物理存储结构原理与架构设计与实践
Atitit.数据库表的物理存储结构原理与架构设计与实践 1. Oracle和DB2数据库的存储模型如图: 1 1.1. 2. 表数据在块中的存储以及RowId信息3 2. 数据表的物理存储结构 自然 ...
- 2019-02-03 线性表的顺序储存结构C语言实现
#include<cstdio> #define MAXSIZE 20 typedef int Elemtype; //Elemtype类型根据实际情况而定,这里取int typedef ...
- C++实现二叉树的链接存储结构(先根、中根和后根遍历)
验证二叉树的链接存储结构及其上的基本操作. [实验要求]: 1. 从文件创建一棵二叉树,并对其初始化: 2. 先根.中根.后根遍历二叉树: 3. 在二叉树中搜索给定结点的父结点: 4. 搜索二叉树中符 ...
- 线性表->链式存储->线形链表(单链表)
文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表 ...
- SQL Server 表和索引存储结构
在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结构上,SQL Server引入对象.分区.堆或 ...
- 线性表->链式存储->双向链表
文字描述 之前的链表(单链表.循环链表)的链式存储结构中只有一个指示直接后继的指针域.由此,从某个结点出发只能顺指针往后寻查其他结点.若要寻查结点的直接前驱,则需从表头指针出发.即单链表中,NextE ...
- 线性表->链式存储->循环链表
文字描述 循环链表是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环.由此,从表中任一结点出发均可找到表中其他结点. 示意图 算法分析 插入.删除.查找等同单 ...
随机推荐
- Docker安装及常用操作
Docker简介: Docker是一个轻量级容器技术,类似于虚拟机技术,但性能远远高于虚拟机,Docker支持将软件编译成一个镜像(image),在这个镜像中做好对软件的各种配置,然后可以运行这个镜像 ...
- java有序map
我们知道TreeMap的key是有顺序的,是自然顺序,也可以指定比较函数. 但TreeMap默认不是按插入的顺序. 为了让Map按照插入顺序显示,可以使用LinkedHashMap吧. 它内部有一个 ...
- Message Queue基本使用说明
一.安装Message Queue: 在Win7之前,控制面板,添加删除组件(Windows Message Queue). Win7~Win8:控制面板,程序和功能,启用或关闭Windows功能(找 ...
- android 模块化
android 插件化 模块化开发(apkplug): http://blog.csdn.net/o1587790525/article/details/11891997 android 模块化环境搭 ...
- unity优化
1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他们都兼容ETC格式, 2. 对于透明贴图,我们只能选择RGBA 16 ...
- 快速掌握用python写并行程序
目录 一.大数据时代的现状 二.面对挑战的方法 2.1 并行计算 2.2 改用GPU处理计算密集型程序 3.3 分布式计算 三.用python写并行程序 3.1 进程与线程 3.2 全局解释器锁GIL ...
- jquery jgrid filterToolBar beforeSearch 修改postData
beforeSearch: function() { var posted_data = $("#mygrid").jqGrid('getGridParam,'postData') ...
- Spark Streaming初探
1. 介绍 Spark Streaming是Spark生态系统中一个重要的框架,建立在Spark Core之上,与Spark SQL.GraphX.MLib相并列. Spark Streaming是 ...
- MVVMLight - Messenger 1
Messenger Mvvm提倡View和ViewModel的分离,View只负责数据的显示,业务逻辑都尽可能放到ViewModel中, 保持View.xaml.cs中的简洁(没有任何代码,除了构造函 ...
- Struts2初步学习总结
Struts2当时上课的时候老师给我们讲过,了解过一些,但也仅仅是了解,,,没动手去做,准确的说是试了一下,然后没做成功,,,现在又想把这个夹生饭给煮一下了,,,, 结合W3Cschool和轻量级Ja ...