线性表

来源:互联网 发布:查股网ddx日线数据 编辑:程序博客网 时间:2024/06/05 14:26

线性表

一、线性表的逻辑结构

1.线性表的定义

线性表简称表,是n个具有相同类型的数据元素的有限序列,线性表中数据元素个数称为线性表的长度。

2.线性表的抽象数据类型定义

线性表是一个相当灵活的数据结构,对线性表的数据元素不仅可以进行存取访问,还可以进行插入和删除等操作。其抽象数据类型定义为:

ADTList

Data

线性表中的数据元素具有相同类型,相邻元素具有前驱和后继关系

Operation

InitList

前置条件:线性不存在

输入:无

功能:线性表的初始化

输出:无

后置条件:一个空的线性表

DestroyList

前置条件:线性表已存在

输入:无

功能:销毁线性表

输出:无

后置条件:释放线性所占用的存储空间

Length

前置条件:线性表已存在

输入:无

功能:求线性的长度

输出:线性表中数据元素个数

后置条件:线性表不变

Get

前置条件:线性表已存在

输入:元素的序号1

功能:按位查找,在线性表中查找序号为1的元素

输出:如果序号合法,返回序号为1的元素值,否则抛出异常

后置条件:线性表不变

Locate

前置条件:线性表已存在

输入:数据元素x

功能:按值查找,在线性表中查找值等于x的元素

输出:如果查找成功,返回元素x在表中的序号,否则返回0

后置条件:线性表不变

Insert

前置条件:线性表已存在

输入:插入位置i,待插元素x

功能:插入操作,在线性表的第i个位置处插入一个新的元素x

输出:若出入不成功,抛出异常

后置条件:若插入成功,表中增加了一个新的元素

Delete

前置条件:线性表已存在

输入:删除位置i

功能:删除操作,删除线性表中的第i个元素

输出:若删除成功,返回被输出的元素,否则抛出异常

后置条件:若删除成功,表中减少一个元素

Empty

前置条件:线性表已存在

输入:无

功能:判空操作,判断线性表是否为空表

输出:若是空表,返回1,否则返回0

后置条件:线性表不变

PrintList

前置条件:线性表已存在

输入:无

功能:遍历操作,按序号依次输出线性表中的元素

输出:线性表的各个数据元素

后置条件:线性表不变

endADT

二、线性表的顺序存储结构及实现

1.线性表的顺序存储结构——顺序表

线性表的顺序存储结构称为顺序表,顺序表需要分配连续的存储空间。

顺序表中元素的序号是从1开始的,线性表中第i个元素存储在数组下表为i-1的位置。

2.顺序表的实现

Constint MaxSize=100;

Template<classDataType>

ClassSeqList

{

public:

Seqlist(){length=0;}

SeqList(DataTypea[],int n);

~SeqList(){}

intLength(){return length;}

DataTypeGet(int i);

intLocate(DataType x);

voidInsert(int i,DataType x);

DatatypeDelete(int i);

VoidPrintList();

private:

DataTypedata[MaxSize];

intlength;};

2.1顺序表有参构造函数SeqList

template<classDataType>

SeqList<DataType>::SeqList(DataTypea[],int n )

{

if(n>MaxSize)throw“参数非法”;

for(i=0;i<n;i++)

data[i]=a[i];

length=n;}

2.2求线性表的长度

求线性表的长度只需要返回成员变量length的值。

2.3查找操作

2.3.1按位查找算法Get

template<classDataType>

DataTypeSeqList<DataType>::Get(int i)

{

if(i<1&&i>length)throw “查找位置非法”;

elsereturn data[i-1];}

2.3.2按值查找locate

template<classDataType>

intSeqList<DataType>::Locate(DataType x)

{

for(i=0;i<length;i++)

if(data[i]==x)return i+1 ;

return0;}

2.4插入操作

顺序表插入算法Insert

template<classDataType>

voidSeqList<DataType>::Insert(int i,DataType x)

{

if(length>=MaxSize)throw“上溢”;

if(i<1||i>length+1)throw“位置”;

for(j=length;j>=i;j--)

data[j]=data[j-1];

data[i-1]=x;

length++;}

2.5删除操作Delete

template<classDataType>

DataType SeqList<DataType>::Delete(inti)

{

if(length==0)throw “下溢”;

if(i<1||i>length)throw“位置”;

x=data[i-1];

for(j=i;j<length;j++)

data[j-1]=data[j];

length--;

return x;}

2.6顺序表遍历操作PrintList

template <class DataType>

void SeqList<DataType>::PrintList()

{

for(i=0;i<length;i++)

cout<<data[i];}

3.线性表的链接存储结构及实现

3.1单链表

单链表是用一组任意的存储单元存放线性表的元素,这组存储单元可以连续也可以不连续。

在单链表的开始结点之前附设一个类型相同的结点。

3.2单链表的实现

template<class DataType>

class LinkList

{

public:

LinkList();

Linklist(DataType a[],int n);

~Linklist();

int Length();

DataType Get(int i);

int Locate(DataType x);

void Insert(int i,DataType x);

DataType Delete(int i);

void PrintList();

private:

Node<DataType>*first;};

3.3求线性表长度算法Length

template<class DataType>

int LinkList<DataType>::Length()

{

p=first->next;count=0;

while(p!=NULL)

{

p=p->next;

count++;}

return count;

}

3.4单链表按位查找算法Get

template<class DataType>

DataType LinkList<DataType>::Get(int i)

{

p=first->next;count=1;

while(p!=NULL&&count<1)

{

if (p->data==x)return count;

p=p->next;

count++;}

if(p==NULL)throw "位置";

else return p->data;

}

3.5单链表按值查找算法Locate

template<class DataType>

int LinkList<DataType>::Locate(DataType x)

{

p=first->next;count=1;

while(p!=NULL)

{

if (p->data==x)return count;

p=p->next;

count++;}

return 0;}

3.6单链表插入操作Insert

template<class DataType>

void LinkList<DataType>::Insert(int i;DataType x)

{

p=first;count=0;

while(p!=NULL&&count<i-1)

{

p=p->next;

count++;}

if(p==NUll)throw"位置";

else{

s=new Node;s->data=x;

s->next=p->next;p->next=s;}}

3.7无参构造函数LinkList

template<class DataType>

LinkList<DataType>::LinkList()

{

first=new Node;

first->next=NULL;

}

3.8头插法建立单链表LinkList

template<class DataType>

LinkList<DataType>::LinkList(DataType a[],int n)

{

first=new Node;first->next=NULL;

for(i=0;i<n;i++)

{

s=new Node;s->data=a[i];

s->next=first->next;first->next=s;}

}

3.9尾插法建立单链表LinkList

template<class DataType>

LinkList<DataType>::LinkList(DataType a[],int n)

{

first=new Node;

r=first;

for(i=0;i<n;i++)

{

s=new Node;s->data=a[i];

r->next=s;r=s;}

r->next=NULL;}

3.10单链表删除算法Delete

template<class DataType>

Datatype LinkList<DataType>::Delete(int i)

{

p=first;count=0;

while(p!=NULL&&count<i-1)

{p=p->next;

count++;}

if(p=NULL||p->next==NULL)

throw"位置";

else{

q=p->next;x=q->next;

p->next=q->next;

delete q;

return x;}}

3.11单链表析构函数算法:~LinkList

template <class DataType>

LinkList<DataType>::~LinkList()

{

while(first!=NULL)

{q=first;

first=first->next;

delete q;}}

 

0 0
原创粉丝点击