【数据结构】头歌实践教学平台·顺序表

题目练习

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 **********/	
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值