线性表(Linear List)
1、线性表的概念
线性表是最基本、最简单、也是最常用的一种数据结构。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了哨位结点)。
在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。
(1)一般线性表:就是我们通常所说的“线性表”,可以自由的删除或添加结点。
(2)受限线性表:主要包括栈和队列,受限表示对结点的操作受限制。
注:我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。
2、线性表的结构特征及特点
线性表是一个有限序列。
线性表是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。
一般地,一个线性表可以表示成一个线性序列(k1,k2,…,kn,其中k1是开始结点,kn是终端结点)。
在实际应用中,线性表都是以栈、队列、串等特殊线性表的形式来使用的。
注:在实现线性表数据元素的存储方面,一般可用顺序存储结构和链式存储结构两种方法。
(1)顺序存储结构主要包括顺序表(即用一维数组作为表的存储结构)。
(2)链式存储结构主要包括单链表、循环链表和双向链表。
另外栈、队列和字符串也是线性表的特殊情况,又称为受限的线性结构。
以下是线性表LinearList 的简单实现:
// LinearList.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <new>
//LinearList 线性表
//定义
template<class T>
class LinearList
{
public :
LinearList(int MaxListSize=10); //构造函数
~LinearList() //析构函数
{
delete[] elements;
}
bool IsEmpty() const //判断是否为空
{
return length==0;
}
int Length() const //获取线性表长度
{
return length;
}
bool Find(int k,T& x)const; //返回第k个元素到x中
int Search(const T& x)const; //查找元素值为x
int Delete(int k,T& x); //删除第K个元素,并将值赋值到x
int Insert(int k,const T& x); //插入第k个元素,其值为x
void Output() ;
private:
int length; //数组长度
int MaxSize; //数组最大长度
T *elements;//一维动态数组
};
//实现...
template<class T>
LinearList<T>::LinearList(int MaxListSize)
{
//基于公式的线性表的构造函数
MaxSize=MaxListSize;
elements=new T[MaxSize];
length=0;
}
template<class T>
bool LinearList<T>::Find(int k,T& x)const
{
if(k<1||k>length)
{
return false;
}
x=elements[k-1];
return true;
}
template<class T>
int LinearList<T>::Search(const T& x)const
{
for(int i=0;i<length;i++)
{
if(elements[i]==x)
{
return ++i;
}
}
return i;
}
template<class T>
int LinearList<T>::Delete(int k,T& x)
{
if(Find(k,x))
{
for(int i=k;i<length;i++)
{
elements[i-1]=elements[i];
}
length--;
return 0;
}
else
{
return -1;
}
}
template<class T>
int LinearList<T>::Insert(int k,const T& x)
{
if(k<0||k>length||length==MaxSize)
{
return -1;
}
for(int i=length-1;i>=k;i--)
{
elements[i+1]=elements[i];
}
elements[k]=x;
length++;
return k;
}
template<class T>
void LinearList<T>::Output()
{
for(int i=0;i<length;i++)
{
std:: cout<<elements[i]<<" ";
}
}
void LinearListSample()
{
LinearList<int> L(5);
std::cout<<"Length="<<L.Length()<<std::endl;
std::cout<<"IsEmpty="<<L.IsEmpty()<<std::endl;
L.Insert(0,2);
L.Insert(1,6);
L.Output();
std::cout<<"IsEmpty="<<L.IsEmpty()<<std::endl;
int z;
L.Find(1,z);
std::cout<<"First elemet is "<<z<<std::endl;
std::cout<<"Length="<<L.Length()<<std::endl;
L.Delete(1,z);
std::cout<<"Deleted element is "<<z<<std::endl;
L.Output();
}
int _tmain(int argc, _TCHAR* argv[])
{
LinearListSample();
//暂停操作
char str;
std::cin>>str;
//程序结束
return 0;
}
运行结果如下: