1、Definition
Arry数组是一种连续储存的List
储存方式:将线性表中的元素一次储存在连续的储存空间中。
Computer's logical structure:
逻辑位置上相邻的元素在物理位置上也相邻
2、Implementation
template<class List_entry>
class List
{
public:
List();
int size();
bool full();
bool empty();
...
protected:
int last;
List_entry entry[max_list];
};
3、Operations
(1)Insert element e at i
InsertElem(L, e, i)
input: i:location, e: ElementType;
Pre-condition: 1<=i<=L.last+1;
Pos-condition: insert element e at i and add 1 to last;
-----------------------------------------------------------------------------------------
int InsertElem(List *L, DataType e, int i)
{
if(((*L).last)>=(maxsize-1))
{
cout<<"overflow"<<endl;
return ERROR; //溢出
}
else if((i<0)||(i>((*L).last+1)))
{
cout<<"ERROR"<<endl;
return ERROR; //非法位置
}
else
{
for(int j=((*L).last);j>=i;j--)
(*L).data[j+1]=(*j).data[j];
(*L).data[i]=e;
(*L).last+=1;
return(1);
}
}
(2)Delete element e at location i
DeleteElem(i)
input: i: location
Pre-condition: 0<=i<=last;
Pos-condition: delete the element at location i and last-1;
---------------------------------------------------------------------------------------------
int Delete(List *L, int i)
{
if(((*L).last)>=(maxsize-1))
{
cout<<"overflow"<<endl;
return ERROR; //溢出
}
else if((i<0)||(i>((*L).last+1)))
{
cout<<"ERROR"<<endl;
return ERROR; //非法位置
}
else
{
for(int j=i;j<((*L).last);j++)
(*L).data[j]=(*L).data[j+1];
(*L).last-=1;
return (1);
}
}
Insert and delete
delete:
最好情况为删除最后一个元素,其他元素不用移动,时间复杂度为O(1)
最坏情况为删除第一个元素,要移动所有元素,时间复杂度为O(N)
insert:
最好情况为在最后一个位置插入,其他元素不用移动,时间复杂度为O(1)
最坏情况为在第一个位置插入,要移动所有元素,时间复杂度为O(N)
(3)Search
按值查找
Search(e, i)
input: e:ElementType;
output: i:location;
Pre-condition: L is not empty;
Pos-condition: output the location of e;
-----------------------------------------------------------------------
int Search(List *L, DataType e)
{
for(int i=0;i<=((*L).last);i++)
if(((*L).data[i])==e)
return i;
return 0;
}
按位查找
Search(i)
input: i:location;
output: e:ElementType;
Pre-condition: 0<=i<=last;
Pos-condition: output the element in the location i;
----------------------------------------------------------------------------------------
DataType Search(List *L, int i)
{
if((i<0)||(i>(*L).last+1))
{
cout<<"ERROR"<<endl;
return NULL;
}
return (*L).data[i];
}
4、Analysis of Array
Advantages:
顺序表的结构比较简单,储存效率高,无需储存元素之间的关系
Disadvantages:
在进行插入和删除操作时时间复杂度高
对长度较大的线性表,须预先分配较大的的空间或经常扩充线性表,不方便。