没有合适的资源?快使用搜索试试~ 我知道了~
王道数据结构-线性表中顺序表的一些综合应用题 王道操作系统-PV操作综合大题总结
需积分: 2 2 下载量 146 浏览量
2022-12-31
10:55:05
上传
评论 5
收藏 244KB PDF 举报
温馨提示
试读
63页
王道数据结构——线性表中顺序表的一些综合应用题 王道操作系统------PV操作综合大题总结 编译通过
资源推荐
资源详情
资源评论
王道数据结构——线性表中顺序表的一些综合应用题
1.长度为 n 的顺序表中,编写一个时间复杂度为 O(n),空间复杂度为 O(1)的算法,
用于删除线性表中所有值为 x 的数据元素。(满足要求的数放在第 k 位上)
#include <cstdio>
/*输出数组名为 a、长度为 n 的数组*/
void print(int *a, int n){
for(int i = 0;i < n; i++){
printf("%d ", a[i]);
}
puts("");
}
/*解法 1,第几个不等于 x 的数就应该在结果的第几个位置上,千万记得最后修改删除后的
数组长度为 k*/
void f1(int *a, int n, int x){
int k = 0;
for(int i = 0; i < n; i++){
if(a[i] != x){
a[k++] = a[i];
}
}
n = k;
print(a,k);
}
/*解法 2,用 k 记录等于 x 的个数,那么下一个不等于 x 的数在结果中的位置应该提前 k 个
位置,最后数组的长度减去 k*/
void f2(int *a, int n, int x){
int k = 0;
for(int i = 0; i < n; i++){
if(a[i] == x)
k++;
else
a[i - k] = a[i];
}
n -= k;
print(a, n);
}
int main()
{
int a[10] = {1,2,3,2,4,2,5,2,6,2};
f1(a,10,2);
int b[10] = {1,2,3,2,4,2,5,2,6,2};
f2(b,10,2);
return 0;
}
2.从有序顺序表中删除其值在给定值 s 与 t 之间(包括 s 和 t,要求 s<t)的所有元素,
如果 s 或者 t 不合理或者顺序表为空则显示出错信息并退出运行。(掐掉中间这段)
#include <cstdio>
/*在有序顺序表中,删除值在[s,t]内的元素
只需找到第一个大于或者等于 s 的位置计数为 i,然后往后找第一个大于 t 的数,将其后的
所有元素依次放到 i 及之后*/
bool Del_s_t(int a[], int n, int s,int t){
if(s>=t || n == 0)
return false;
int i = 0, j = 0;
for(i = 0; i < n && a[i] < s; i++);
if(i >= n)
return false;//全部小于 s
for(j = i; j < n && a[j] <= t; j++);
for(;j < n; j++){
a[i++] = a[j];
}
n = i;
//输出
for(int i = 0; i < n; i++){
printf("%d ", a[i]);
}
puts("");
return true;
}
int main()
{
int a[]={2,4,5,6,7,8,9,11,12,13,14,15,15};
Del_s_t(a, 13, 3, 10);
return 0;
}
3.从顺序表中删除其值在给定值 s 与 t 之间(包括 s 和 t,要求 s<t)的所有元素,如果 s
或者 t 不合理或者顺序表为空则显示出错信息
并退出运行(注意与上题的区别是无序的)。
(满足要求的数放在第 k 位上)
#include <cstdio>
#include <algorithm>
using namespace std;
void print(int a[], int n){
for(int i = 0; i < n; i++){
printf("%d ", a[i]);
}
puts("");
}
/*对于无序的顺序表,将数分成两类,一个在区间一个不在区间,然后计数不在区间的数
为 k
碰到在区间的数应该在结果的第 k 个位置上,最后总长度为 k*/
void Del_s_t2(int a[], int n, int s, int t){
if(s >= t || n == 0)
return;
int k = 0;
for(int i = 0; i < n; i++) {
if(a[i] < s || a[i] > t)
a[k++] = a[i];
}
n = k;
print(a, n);
}
int main()
{
int a[] = {7,2,9,4, 5,1,3,14};
//sort(a, a + 8);
print(a, 8);
Del_s_t2(a, 8, 3, 7);
return 0;
}
4.从有序的顺序表中删除相同的元素,使得表中每个元素都不同。(满足要求的数放在第 k
位上)
#include <cstdio>
#include <algorithm>
using namespace std;
void print(int a[], int n){
for(int i = 0; i < n; i++){
printf("%d ", a[i]);
}
puts("");
}
/*从有序表中删除相同的元素,只需将于之前不同的数放在第 k 个位置上即可*/
void Del_diffe(int a[], int n){
int k = 1;
for(int i = 1; i < n; i++){
if(a[i] != a[i - 1])
a[k++] = a[i];
}
n = k;
print(a, k);
}
int main()
{
int a[] = {1,1,2,2,2,4,4,5,5,5,5,6,6};
Del_diffe(a, 13);
return 0;
}
5.合并两个有序表。
#include <cstdio>
/*合并两个有序表,依次比较,然后添加剩余*/
const int lmax = 50;
int c[lmax];
bool merge(int a[], int la, int b[], int lb){
if(la + lb >= lmax)
return false;
int i = 0,j = 0,k = 0;
while(i < la && j < lb){
if(a[i] <= b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while(i < la){
c[k++] = a[i++];
}
while(j < lb){
c[k++] = b[i++];
}
return true;
for(i = 0; i < k; i++){
printf("%d ", c[i]);
}
puts("");
}
int main()
{
int a[]={1,5,6,8,9,11,12,15,17},la = 9;
int b[]={2,3,4,6,7,9,10}, lb = 7;
merge(a,la,b,lb);
return 0;
}
6.将一个顺序表中的两个顺序表互换位置。(矩阵逆置)
#include <cstdio>
void print(int a[], int n){
for(int i = 0; i < n; i++){
printf("%d ", a[i]);
}
puts("");
}
/*逆置数组某一区间的方法
数组及其长度,逆置的起始位置和终止位置
中间位置等于起始位置加上终止位置除以 2
*/
void Reverse(int a[],int n, int s, int t)
{
if(s >= t || t >= n)
return;
int mid = (s + t)/2;
for(int i = 0; i <= (mid - s); i++){
int temp = a[s + i];
a[s + i] = a[t - i];
a[t - i] = temp;
}
}
/*
sc 表示交换次数
*/
void Reverse2(int a[], int n, int s, int t){
if(s >= t || t >= n)
return;
剩余62页未读,继续阅读
资源评论
千秋TʌT
- 粉丝: 125
- 资源: 150
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功