将线性表的抽象数据类型定义在链接存储结构下用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. selenium IDE 命令二(断言、验证、等待、变量)

    测试用例需要做断言和验证,在seleniumIDE中提供了断言和验证来对结果进行比较 首先通过打开seleniumIDE,在页面任意一个元素右键,选择最后一个选项“show all available ...

  2. JavaEE_XMind总结

    1 Servlet 2 ServletContext 3 HttpServletResponse 4 HttpServletResquest 5 Cookie

  3. 截取字符串-【.net】

    问题: 如: asdasdfasdf asdfasdf 12sdfsdf asdfa 截取后为: asdasdfasdf asdfasdf 12sdfsdf 为第一段asdfa 为第二段 解答: Di ...

  4. hibernate 执行存储过程 方法

    private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) ...

  5. Django 入门项目案例开发(中)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. 昨天已经描述了如何搭建Django的开发环境,今天描述业务流程,具体我们要实现一个什么样的业务 ...

  6. PHP之数组和函数的基本教程

    [PHP数组的分类] 按照下标的不同,PHP数组分为关联数组与索引数组 索引数组:下标从0开始,依次增长: 关联数组:下标为字符串格式,每个下标字符串与数字的值一一关联对应(有点像对象的键值对) [关 ...

  7. [转]字符编码笔记:ASCII,Unicode 和 UTF-8

      本文非原创,转载 ,原文地址 :http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 作者: 阮一峰 日期: 20 ...

  8. WPF MVVM 之理解(数据绑定)

    (申明:最近在做一个练习,写点东西,谨供参考.) 1.界面展示:其中的布局和样式就不说了,重点在MVVM架构和数据绑定(Model层使用EF(Entity Framework)实体框架,不做介绍). ...

  9. tsung

    要做针对mongodb的压力测试,下了个tsung,看看他的策略是什么,目前定位ts_launcher.erl:do_launch({Intensity, MyHostName, PhaseId})- ...

  10. Java 基础(2)——编译运行 & 规范

    上节学到 Java 的编译与运行,我们已经学会了怎么去执行一个写好(假装我们已经会写了)的代码,这篇当然要试试手啦 O(∩_∩)O 哈哈~ 小试一下 新建一个 HelloAhanWhite.java ...