数据结构之线性表实现【详解】

在这里插入图片描述

线性表(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;  
}  

运行结果如下:
这里写图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值