将线性表的抽象数据类型定义在链接存储结构下用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++实现线性表的链接存储结构(单链表)的更多相关文章

  1. 数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析

    #include<stdio.h>#include<stdlib.h>//线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初 ...

  2. 数据结构C语言实现系列——线性表(线性表链接存储(单链表))

    #include <stdio.h>#include <stdlib.h>#define NN 12#define MM 20typedef int elemType ;/** ...

  3. Atitit.数据库表的物理存储结构原理与架构设计与实践

    Atitit.数据库表的物理存储结构原理与架构设计与实践 1. Oracle和DB2数据库的存储模型如图: 1 1.1. 2. 表数据在块中的存储以及RowId信息3 2. 数据表的物理存储结构 自然 ...

  4. 2019-02-03 线性表的顺序储存结构C语言实现

    #include<cstdio> #define MAXSIZE 20 typedef int Elemtype; //Elemtype类型根据实际情况而定,这里取int typedef ...

  5. C++实现二叉树的链接存储结构(先根、中根和后根遍历)

    验证二叉树的链接存储结构及其上的基本操作. [实验要求]: 1. 从文件创建一棵二叉树,并对其初始化: 2. 先根.中根.后根遍历二叉树: 3. 在二叉树中搜索给定结点的父结点: 4. 搜索二叉树中符 ...

  6. 线性表->链式存储->线形链表(单链表)

    文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表 ...

  7. SQL Server 表和索引存储结构

    在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结构上,SQL Server引入对象.分区.堆或 ...

  8. 线性表->链式存储->双向链表

    文字描述 之前的链表(单链表.循环链表)的链式存储结构中只有一个指示直接后继的指针域.由此,从某个结点出发只能顺指针往后寻查其他结点.若要寻查结点的直接前驱,则需从表头指针出发.即单链表中,NextE ...

  9. 线性表->链式存储->循环链表

    文字描述 循环链表是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环.由此,从表中任一结点出发均可找到表中其他结点. 示意图 算法分析 插入.删除.查找等同单 ...

随机推荐

  1. oracle 中的exists 和 in 效率问题

    oracle中的 exists 和 in 的效率问题 --------------------------------------------------------------- +++++++++ ...

  2. JWT(Json Web Token)初探与实践

    前言什么是JWT?为什么使用JWT?什么时候使用JWT?JWT的基本结构HeaderPayloadSignature将他们放在一起项目实践JWT后端前端关于安全性总结参考 协议标准:https://t ...

  3. Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)

    1.通过select for update或select for update wait或select for update nowait给数据集加锁 具体实现参考select for update和 ...

  4. HTML基础笔记

    html基础 (1)什么是html?超文本标记语言 用于开发网页的语言,由浏览器解释执行 (2)html文件的基本结构 <html> <head> <title>& ...

  5. 案例16-validate自定义校验规则校验用户名是否存在

    1 知识点 2 register.jsp代码 注意自定义校验规则的时候,提交必须是同步的方式. <%@ page language="java" contentType=&q ...

  6. android中The connection to adb is down,问题和解决

    android中The connection to adb is down,问题和解决   自己总结的在android中常会出现的不好解决的问题和方法(其中第三个方法经过了四天的折磨.....哎) 1 ...

  7. c#随便写写 数据层和表现层,队列执行

    base.xxx() 调用父类的方法

  8. pycurl安装问题

    pycurl安装问题 之前人写的代码中依赖pycurl,所以准备在ubuntu14.04.4 LTS系统上安装一下.发现了不少问题. Could not run curl-config 最开始遇到问题 ...

  9. spring的基本用法

    1,关于spring容器: spring容器是Spring的核心,该 容器负责管理spring中的java组件, ApplicationContext ctx = new ClassPathXmlAp ...

  10. 二叉树数组C++实现

    基本概念梳理 孩子:子结点 双亲:父节点 度:有多少个子结点 有序树:固定的排列的树 无序树:排列与顺序无关的树 二叉树:所有结点小于等于2的树 源代码:https://github.com/cjy5 ...