将线性表的抽象数据类型定义在链接存储结构下用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 处理锁表sql

    declare --类型定义 cursor c_cur is --查询锁表进程 SELECT object_name, machine, s.sid, s.serial# FROM gv$locked ...

  2. DataTable对象

    DataTable表示一个内存中的关系数据表,可以独立创建和使用,也可以有其他.NET Framework对象使用,最常见的情况是作为DataSet的成员使用.DataTable对象由DataColu ...

  3. 禅道 xampp中的mysql启动时无法产生err文件

       使用opt/lampp/lampp start命令启动 错误提示:root@zabbix_server ~]# /opt/lampp/bin/mysqld_safe_helper: Can‘t ...

  4. RequireJs使用快速入门

    前言:Requirejs作为一个ES5环境流行的模块加载器,在很多项目中使用它.而且这个开源库任然在更新,同类产品seajs已经不更新了. ES6之后引入import 或者使用Commonjs的方式引 ...

  5. java中wait和notify的关系

    java中,wait和notify这两个方法是一对,wait方法阻塞当前线程,而notify是唤醒被wait方法阻塞的线程.     首先,需要说明的是,wait和notify方法都是Object的实 ...

  6. XAMl使用其他命名空间中的类型及加载和编译

    以前我们讲过XAMl命名空间.为了使便宜钱知道XAMl文档中元素对应的.NET类型,需要知道XAMl明档中指定特定的两个命名空间.XAML是一种实例化.NET对象的通用方法 ,除了可以实例化一些标准的 ...

  7. 四:SpringThinking

    一:将对象配置到容器 1.xml文件:空参构造 <bean name="user" class="com.spring.bean.User" scope= ...

  8. 七、集成swagger2

    1.添加依赖 <!-- swager2 --> <dependency> <groupId>io.springfox</groupId> <art ...

  9. 改善Java程序的151个建议(1-4)

    1.不要在常量和变量中出现易混淆的数字 个人感觉这条在于编程命名的规范性.代码除了给机器看,也要给人看.要写能够结构清晰,命名规范,让人看懂的代码. 字母l作为长整型标志时务必大写 L 2.莫让常量蜕 ...

  10. python使用元类

    原文:https://blog.csdn.net/youzhouliu/article/details/51906158 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义 ...