数据结构[2]

171 阅读3分钟

线性表


携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

线性表的定义和基本操作

线性表的定义

线性表示具有相同数据类型的 n 个数据元素的有限序列

线性表的特点

  • 表中元素的个数有限
  • 表中元素具有逻辑上的顺序性,表中的元素有其先后次序
  • 表中元素都是数据元素,每个元素都是单个元素。
  • 表中元素的数据类型都相同,每个元素占有相同大小的存储空间
  • 表中元素具有抽象性

线性表的基本操作

InitList(&L) //初始化表。构建一个空表。
Length(L) //求表长。
LocateElem(L,e) //按值查找操作。在表中查找具有给定关键字值的元素。
GetElem(L,i) //按位查找操作》获取表中第i个位置元素的值。
ListInsert(&L,i,e) //插入操作。在表L中第i个位置插入e元素。
ListDelete(&L,i,e) //删除操作。在表L中删除第i个元素。
PrintList(L) //打印操作。按先后顺序依次打印
Empty(L) //判空操作若L为空表,返回ture
DestroyList(L) //销毁表L。

顺序表

顺序表的特点:逻辑顺序与其物理顺序相同。 线性表的顺序存储类型描写为

#define Maxsize 50    //定义线性表的最大长度
typedef struct{
    ElemType data[MaxSize]
    int length;
}sqlList

应用题


设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X,…,Xn-1)变换为(Xp,Xp+1,...Xn-1,X0,X1,...,Xp-1).要求: 1)给出算法的基本设计思想。 2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。 3)说明你所设计算法的时间复杂度和空间复杂度


算法设计的基本思想: 可将这个问题视为把数组ab转换成数组ba(a代表数组的前p个元素,b代表数组中余下的n-p个元素),先将a逆置得到a-1b(a逆b),再将b逆置得到a-1b-1(a逆b逆),最后将整个a-1b-1逆置得到(a-1b-1)-1=ba。 设Reverse函数执行将数组元素逆置的操作,对abcdefgh向左循环移动3(p=3)个位置的过程如下: Reverse(0,p-1)得到cbadefgh; Reverse(p,n-1)得到cbahgfed; Reverse(0,n-1)得到defghabc; 注:Reverse中,两个参数分别表示数组中待转换元素的始末位置。 使用C语言描述算法如下:


void Reverse(int R[],int from,int to){
int i,temp;
for(i=0;i<(to-from+1)/2;i++){
    temp=R[from+i];
    R[from+i]=R[to-i];
    R[to-il=temp;
    }
}//Reverse 
void Converse(int R[],int n,int p){
Reverse(R,0,p-1);
Reverse(R,p,n-1);
Reverse(R,0,n-1);

3)上述算法中三个Reverse函数的时间复杂度分别为O(p/2)、O((n-p)/2)和O(n/2),故所设计的算法的时间复杂度为O(n),空间复杂度为0(1)。