一、相关知识点
1.顺序表的特点:表中元素的逻辑顺序和物理顺序相同。
2.线性表的顺序存储结构是一种随机存取的存储结构。
3.线性表中的标号从1开始,对应数组从0开始
4.插入、删除、顺序查找的时间复杂度为O(n)
二、综合应用题
参考王道考研数据结构
1.对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,删除线性表中所有值为x的元素。
算法思想:用k记录顺序表中不等于x的元素的个数。扫描L,遇到不等于x的元素,data[k]=data[i],k++
void delete_x(List &L,ElementType x){
int k=0;//记录值不等于x的元素的个数
for(int i=0;i<L.length;i++){
if(L.data[i]!=x){
L.data[k]=L.data[i];
}
}
L.length=k;
}
2.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值都不相同。
算法思想:初始时将第一个元素视为非重复的有序表。依次判断后面的元素是否与前面非重复有序表的最后一个元素相同。若相同,继续向后判断;若不同,则插入前面的非重复有序表的最后。直到判断到表尾。
bool deleteSame(List &L){
if(L.Length==0)
return false;
int i,j; //i存储最后一个不相同的元素,j为工作指针
for(i=0,j=1;j<L.Length;j++){
if(L.data[i]!=L.data[j]){ //找到下一个不相同的
i++;
L.data[i]=L.data[j]; //更新i
}
}
L.Length=i+1;
return true;
}
3.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
算法思想:按顺序不断取两个顺序表表头较小的节点存入新的顺序表。看哪个表有剩余,将剩下部分添加到后面。
bool Merge(List &l1,List &L2,List &L){
if(L1.Length+L2.Length>L.Length)
return false;
int i=0,j=0,k=0;
while(i<L1.Length&&j<L2.Length){
if(L1.data[i]<L2.data[j])
L.data[k++]=L1.data[i++];
else
L.data[k++]=L2.data[j++];
}
while(i<L1.Length)
L.data[k++]=L1.data[i++];
while(j<L2.Length)
L.data[k++]=L2.data[j++];
L.Length=k;
return true;
}
4.已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,a3,…,am)和(b1,b2,b3,…,bn)。试编写一个函数,将数组中的两个顺序表的位置互换。
算法思想:利用空间复杂度为O(1)的逆置算法
先将数组中的全部元素(a1,a2,…,am,b1,b2,…,bn)原地逆置为(bn,bn-1,…,b1,am,…a1),再对前n个元素和后m个元素分别使用逆置算法,即可得到(b1,b2,…,bn,a1,a2,…,am)
void reverse(ElementType data[],int left,int right,int arraySize){
if(left>=right||right>=arraySize)
return false;
int mid=(left+right)/2;
for(int i=0;i<=mid-left;i++){
ElementType temp=data[left+i];
data[left+i]=data[right-i];
data[right-i]=temp;
}
}
void exchange(ElementType data[],int left,int right,int arraySize){
reverse(data,0,m+n-1,arraySize);
reverse(data,0,n-1,arraySize);
reverse(data,n,m+n-1,araySize);
}