代码练习题

一、顺序表练习题
1.顺序表递增有序,插入元素x,仍递增有序
2.用顺序表最后一个元素覆盖整个顺序表中最小元素,并返回该最小元素
3.将顺序表中的元素逆置
4.将(a1,a2,a3…,am,b1,b2,…,bn)转换成(b1,b2,…,bn,a1,a2,a3…,am)
5.删除顺序表中所有值为x的元素(两种方法)
6.从顺序表中删除给定值在s到t之间(包含s和t)的所有元素

void delete_s_t(SqList &L, int s, int t){
	for(int i = 0; i < L.length; i++){
		if(L.data[i] >= s &&  L.data[i] <= t){
			for(int j = i; j < L.length - 1; j++){
				L.data[j] = L.data[j + 1];
			}
			L.length--;
		}
	}
	return;
}

7.从有序表中删除所有值重复的元素

void delete_repeat_elem(SqList &L){
	for(int i = 1; i < L.length; i++){
		if(L.data[i] == L.data[i - 1]){
			for(int j = i; j < L.length - 1; j++){
				L.data[j] = L.data[j + 1];
			}
			L.length--;
		}
	}
	return;
}

8.两个递增有序表合并成一个递增有序表(两种方法)

bool union_L1_L2(SqList L1, SqList L2, int A[100]){
	if(L1.length + L2.length > 100){
		return false;
	}
	int i,j,len = 0;
	for(i = 0,j = 0; i < L1.length && j < L2.length;){
		if(L1.data[i] < L2.data[j]){
			A[len++] = L1.data[i++];
		}else{
			A[len++] = L2.data[j++];
		}
	}
	if(i < L1.length){
		for(i; i < L1.length; i++){
			A[len++] = L1.data[i];
		}
	}
	if(j < L2.length){
		for(j; j < L2.length; j++){
			A[len++] = L2.data[j];
		}
	}
	return true;
}

9.求两个递增序列合并后的中位数

int median(SqList L1, SqList L2, A[100]){
	if(L1.length + L2.length > 100){
		return false;
	}
	int i,j,len = 0;
	for(i = 0,j = 0; i < L1.length && j < L2.length;){
		if(L1.data[i] < L2.data[j]){
			A[len++] = L1.data[i++];
		}else{
			A[len++] = L2.data[j++];
		}
	}
	if(i < L1.length){
		for(i; i < L1.length; i++){
			A[len++] = L1.data[i];
		}
	}
	if(j < L2.length){
		for(j; j < L2.length; j++){
			A[len++] = L2.data[j];
		}
	}
	if((L1.length + L2.length) % 2 == 0){
		int ret = (L1.length + L2.length)/2 - 1;
	}else{
		int ret = (L1.length + L2.length)/2;
	}
	
	return A[ret];
}

10.设计一个时间上尽可能高效的算法,找出数组中未出现的最小正整数

int min_int(int A[], int n){
	int B[n];
	for(int i = 0; i < n; i++){
		B[i] = 0;
	}
	for(int i = 0; i < n; i++){
		if(A[i] > 0 && A[i] <= n){
			B[A[i]]++;
		}
	}
	for(int i = 1; i < n + 1; i++){
		if(B[i] == 0){
			return i;
		}
		return n+1;
	}
}//分配一个长度为 n 的数组B,用来记录 A 中是否出现了 1~n 中的正整数的出现次数
int min_int(int A[], int n){
	for(int i = 1; i <= n; i++){
		int count = 0;
		for(int j = 0; j < n; j++){
			if(i == A[j]){
				count++;
			}
		}
		if(count == 0){
			return i;
		}
	}
	return n + 1;
}//循环 [1, n] 之间的所有数,判断它们在数组 A 中的出现次数

11.若一个整数序列中有过半相同元素,则称其为主元素,设计算法找出数组A[a0,a1,…,an-1]的主元素。(其中0<ai<n,若存在主元素则输出,否则返回-1)

二、链表练习题
1.设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
2.删除带头结点单链表中所有值为x的结点
3.删除带头结点单链表中第一个值为x的结点
4.从尾到头反向输出单链表每个结点的值
5.试编写算法将单链表就地逆置
6.从链表中删除给定值在s到t之间(不包含s和t)的所有元素
7.试编写在带头的单链表L中删除最小值点的高效算法(已知最小值唯一)
8.试编写在不带头结点的单链表L中删除最小值点的高效算法(已知最小值唯一)
9.给定一个单链表,按递增排序输出单链表中各结点的数据元素,并释放结点所占空间
10.将一个带头结点的单链表A分解成两个带头结点的单链表A和B,使A中含奇数位置元素,B中
含偶数位置元素,且相对位置不变
11.将一个单链表{a1,b1,a2,b2,…,an,bn}拆分成{a1,a2,…,an}和{bn,bn-1,…,b1}
12.删除递增链表中重复的元素
13.两个递增有序的单链表,设计算法成一个非递减有序的链表
14.两个递增有序的单链表,设计算法成一个非递增有序的链表
15.A,B两个单链表递增有序,从A,B中找出公共元素产生单链表C,要求不破坏A,B结点
16.A,B两个单链表递增有序,从A,B中找出公共元素并存放于A链表中
17.两个序列分别为A、B,将其存放到链表中,判断B是否试A的连续子序列
18.查找单链表中倒数dik个结点,若成功,则输出该结点的data,并返回-1,否则返回0
19.用单链表保存m个整数,并且|data|<=n,要求设计时间复杂度尽可能高效的算法,对于data绝对值相等的点,仅保留第一次出现的点
20.判断带头结点的循环双链表是否对称
21.有两个循环单链表,链表头指针分别为h1,h2,试编写函数将h2链表接到h1之后,要求链接后仍保持循环链表形式
22.设有一个带头结点的循环单链表,其结点值为正整数,设计算法反复找出链表内最小值并不断输出,并将结点从链表中删除,直到链表为空,再删除表头结点
23.判断单链表是否有环
24.给定一个单链表L(a1,a2,a3,…,an),将其重新排列为(a1,an,a2,an-1,…)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和安韩Pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值