线性表的类型定义
线性表的基本操作:
顺序表的结构
解析:
这里LOC(A)指的是100
sizeof(ElemType) 指的是2
i 是 5
100+2*4=108
线性表的顺序存储类型描述为:
#define MaxSize 50
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
顺序表的特点:
- 顺序表最主要的特点是随机存取,即通过首地址和元素序号可在时间O(1)内找到指定的元素。
- 顺序表的存储密度高,每个结点只存储数据元素。
- 顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素。
题 3.当需要随机查找线性表的元素时,宜采用 () 作存储结构。
A.链表
B.循环链表
C.顺序表
D.单链表
答案:C
顺序表的实现
(1)插入
bool ListInsert(SqList &L,int i,ElemType e)
{
if(i<1 || i > L.length+1)
return false;
for(int j=L.length;j>=i;j--) //j对应的是数组的下标,i对应数组的元素
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.length++;
return false;
}
删除操作
bool ListDelete(SqList &L,int i,Elemtype &e){
if(i<1||i>L.length)
return false
e =L.data[i-1]
for(int j=i;j<L.length;j++)
L.data[j-1]=L.data[j];
L.length--;
return true;
}
将第 i 个元素往后的所有元素(n-i)往前移动
解析:
如果是指定值为x的元素的话那就没有顺序表与链表的差别了,都是从第一个元素开始顺序查找.假设长度为n的线性表中只有一个值为x的元素,则从第一个元素起到找到值为a(假设为第i个元素)比较 i 次,删除 i 后,第 i+1 个元素到第 n 个元素都要移动,移动n-(i+1)+1即 n-i 次故比较元素和移动元素的总次数为 n 次.注:以上答案是针对线性表中只有一个值为x的元素若有多个值为a的元素则总次数是不确定的
按值查找操作
在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SqList L,ElemType e){
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1
return 0;
}
按位查找操作
int GetElem(SqList L,int i){
if(i<1||i>L.length)
return 0;
return L.data[i-1];
}
题 4.将两人有序顺序表A,B合并为一个新的有序顺序表C,并用函数返回结果顺序表。
算法思想:首先,按顺序不断取下两个顺序表表头较小的结点存入新的顺序表中。然后看哪个表还有剩余,将剩下的部分添加到新的顺序表后面
bool Merge(SqList A,SqList B,SqList &C){
if(A.length+B.length>C.MaxSize)
return false;int
i=0,j=0,k=0;
while(i<A.length&&j<B.length){
if(A.data[i]<=B.data[j])
C.data[k++]=A.data[i++];
else
C.data[k++]=B.data[j++];
}
while(i<A.length)
C.data[k++]=A.data[i++];
while(j<B.length)
C.data[k++]=B.data[j++];
C.length=k;
return true;
}