文章目录
题目练习
1.顺序表的取值操作
要求
顺序表L已存在,先判断i值是否合法,如果合法,将顺序表L中第i个数据元素的值赋给e,e要带出函数体,类型声明为引用。
代码
int main(){
SqList L;
int i;
ElemType e;
//建立顺序表
InitList(L);
//取值操作
cin>>i; //输入元素位置
if(GetElem(L,i,e)==OK ){
cout<<"查找成功!"<<endl;
cout<<"第"<<i<<"个元素的值:"<<e<<endl;
}
else
cout<<"查找失败!"<<endl;
DestroyList(L);//销毁数据表
return 0;
}
Status GetElem(SqList L, int i ,ElemType &e){
// 初始条件:顺序线性表L已存在,i为元素的序号
// 操作结果:用e返回表L中第i个元素的值,如取值成功,返回OK,否则返回ERROR.
/********** Begin **********/
if(i < 1 || i > L.length) {
return ERROR;
}
e = L.elem[i - 1];
return OK;
/********** End **********/
}
2.顺序表的查找操作
要求
在顺序表L找第一个值为e的元素,找到后返回其序号,否则返回0。
代码
int main(){
SqList L;
int i;
ElemType e;
//建立顺序表
InitList(L);
//输入待查找的数据,然后调用查找函数,按要求输出查找结果。
/********** Begin **********/
cin>>e;
i = LocateElem(L, e);
if (i == 0) {
cout<<"查找失败!";
}
else
cout<<"查找成功,"<<e<<"是数据表第"<<i+1<<"元素!";
/********** End **********/
DestroyList(L);//销毁数据表
return 0;
}
int LocateElem(SqList L, ElemType e){
// 初始条件:顺序线性表L已存在
// 操作结果:在顺序表中查找e,如果找到,则返回e第一次出现的位置,否则返回0.
/********** Begin **********/
for (int i = 0; i < L.length; i++) {
if (L.elem[i] == e) return i;
}
return 0;
/********** End **********/
}
3.顺序表的插入操作
要求
顺序表的插入运算是指在表的第i (1≤i≤n+1)个位置,插入一个新元素e,使长度为n的线性表 ( a 1,…,a i−1,a i,…,a n) 变成长度为n+1的线性表( a 1,…,a i−1,x,a i+1,…,a n) 。
代码
Status ListInsert(SqList &L,int i,ElemType e){
// 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1
// 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
/********** Begin **********/
if ((i < 1) || (i > L.length + 1)) return ERROR;
if (L.length == MAXSIZE) return ERROR;
for (int j = L.length - 1; j >= i-1; j--) {
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
++L.length;
return OK;
/********** End ***********/
}
4.顺序表的删除操作
要求
线性表的删除运算是指将表的第i(1≤i≤n)个元素删去,使长度为n的线性表 ( a 1,…,a i−1,a i,a i+1,…,a n),变成长度为n-1的线性表( a 1,…,a i−1,a i+1,…,a n)。
代码
Status ListDelete(SqList &L,int i,ElemType& e){
// 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
// 操作结果:删除表L中第i个位置的元素,L的长度减1
/********** Begin **********/
if ((i < 1) || (i > L.length)) return ERROR;
e = L.elem[i - 1];
for (int j = i; j < L.length; j++) {
L.elem[j - 1] = L.elem[j];
}
--L.length;
return OK;
/********** End **********/
}
5.顺序表的逆置操作
要求
顺序表的就地逆置,只需让顺序表中的数据元素头尾依次交换即可,即交换第一个元素和最后一个元素,第二个和倒数第二个,依此类推,这种方法的空间复杂度为O(1)。
代码
void ListRervese(SqList &L){
// 初始条件:顺序线性表L已存在
// 操作结果:将顺序表中就地逆置
/********** Begin **********/
for (int i = 0, j = L.length - 1; i < j; i++, j--) {
int t = L.elem[i];
L.elem[i] = L.elem[j];
L.elem[j] = t;
}
/********** End **********/
}
6.两个有序顺序表的合并操作
要求
已知有两个按元素值递增有序的顺序表LA和LB。设计一个算法将顺序表LA和LB的全部元素归并到一个按元素递增有序的顺序表LC中。
代码
void MergeList(SqList La,SqList Lb,SqList &Lc){
// 初始条件:非递减顺序表La和Lb已存在
// 操作结果:将La和Lb得到新的顺序表Lc,Lc的元素也按值非递减排列。
/********** Begin **********/
Lc.length = La.length + Lb.length;
Lc.elem = new ElemType[Lc.length];
int *pc;
int *pa;
int *pb;
int *pc_last;
int *pa_last;
int *pb_last;
pc = Lc.elem;
pa = La.elem;
pb = Lb.elem;
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
while ((pa <= pa_last) && (pb <= pb_last)) {
if(*pa <= *pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
while (pa <= pa_last) *pc++ = *pa++;
while (pb <= pb_last) *pc++ = *pb++;
/********** End **********/
}