目录
1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置有最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
2.设计一个高效的算法,将顺序表的所有元素逆置,要求算法的空间复杂度为O(1).
3.长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
4.从有序顺序表中删除其值在给定值 s 与 t 之间(要求s < t)的所有元素,如果s 或 t不合理或者顺序表为空则显示出错信息并退出运行。编辑
5.从顺序表中删除其值在给定值s与t之间(包含s和t,要求s)的所有元素,如果s和t不合理或者顺序表为空则显示出错信息并退出运行。<>
6.从有序顺序表中删除所有其值重复的元素,是表中所有元素的值均不同。编辑
7.将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表。
10.设将n(n>1)个整数存放到一堆数组R中,试设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0
1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置有最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
/*
02_01.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置有最后一个元素填补,若顺序表为空则显示出错信息并退出运行
*/
#include <stdio.h>
#define Max 50
typedef struct SqList {
int a[Max] = { 2,3,4,6,7,1,8,9 };
int length = 8;
}SqList;
bool ListDelete(SqList& s, int& elem)
{
if (s.length == 0)
return false;
int min_num = s.a[0];
int flag = 0; //记录数组下标
for (int i = 1; i < s.length; i++)
{
if (s.a[i] < min_num)
{
min_num = s.a[i];
flag = i;
}
}
elem = s.a[flag];
s.a[flag] = s.a[s.length - 1];
return true;
}
int main()
{
SqList s;
printf("原先数组为:\n");
for (int i = 0; i < s.length; i++)
printf("%3d", s.a[i]);
printf("\n");
int k = 0;
if (ListDelete(s, k))
{
printf("最小元素为 k = %d\n", k);
printf("修改之后的线性表为:\n");
for (int i = 0; i < s.length; i++)
printf("%3d", s.a[i]);
printf("\n");
}
else
printf("错误\n");
return 0;
}
2.设计一个高效的算法,将顺序表的所有元素逆置,要求算法的空间复杂度为O(1).
/*
设计一个高效的算法,将顺序表的所有元素逆置,要求算法的空间复杂度为O(1)
*/
#include <stdio.h>
#define Max 50
typedef struct SqList {
int a[Max] = { 1,4,6,3,2,8,7 };
int length = 7;
}SqList;
void Reverse(SqList &L)
{
for (int i = 0; i <= L.length / 2; i++)
{
int temp = L.a[i];
L.a[i] = L.a[L.length - i - 1];
L.a[L.length - i - 1] = temp;
}
}
int main()
{
SqList L;
for (int i = 0; i < L.length; i++)
printf("%3d", L.a[i]);
printf("\n");
Reverse(L);
for (int i = 0; i < L.length; i++)
printf("%3d", L.a[i]);
printf("\n");
return 0;
}
3.长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
/*
长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,
该算法删除线性表中所有值为x的数据元素。
*/
#include <stdio.h>
#define Max 50
typedef struct SqList {
int a[Max] = { 5,2,0,1,3,1,4,1,1,4 };
int length = 10;
}SqList;
void delete_x(SqList& L, int x)
{
int k = 0;
for (int i = 0; i < L.length; i++)
{
if (L.a[i] == x)
k++;
else
L.a[i - k] = L.a[i];
}
L.length = L.length - k;
}
int main()
{
SqList L;
for(int i = 0; i < L.length; i++)
printf("%3d", L.a[i]);
printf("\n");
delete_x(L, 1);
for(int i = 0; i < L.length; i++)
printf("%3d", L.a[i]);
printf("\n");
return 0;
}
4.从有序顺序表中删除其值在给定值 s 与 t 之间(要求s < t)的所有元素,如果s 或 t不合理或者顺序表为空则显示出错信息并退出运行。
(此图来源于b站的名为"憨憨鱼怪"的博主,仅用于学习,再次感谢~)
/*
从有序顺序表中删除其值在给定值 s 与 t 之间(要求s < t)的所有元素,
如果s 或 t不合理或者顺序表为空则显示出错信息并退出运行。
*/
#include <stdio.h>
#define Max 50
typedef struct SqList {
int a[Max] = { 1,2,3,3,4,5,6,7,7,7,8,9 };
int length = 12;
}SqList;
//open interval 开区间
bool DeleteOpenInterVal(SqList& L, int s, int t)
{
if (s >= t || L.length == 0)
return false;
int left = 0; //记录>左端点s的第一个数据元素的下标值
bool flag = false; //用来判断是否存在>s的值
for (int i = 0; i < L.length; i++)
{
if (L.a[i] > s)
{
left = i;
flag = true;
break;
}
}
if (!flag)//不存在>s的数据元素则返回false
return false;
int right = 0;//记录>=右端点t的第一个数据元素的下标
for (int i = left; i < L.length; i++)
{
if (L.a[i] >= t)
{
right = i;
break;
}
}
int Lpos = left, Rpos = right;
//删除(s,t)的所有元素
for (int i = right; i < L.length; i++)
{
L.a[left] = L.a[i];
left++;
}
L.length = L.length - (Rpos - Lpos);
return true;
}
int main()
{
SqList L;
for (int i = 0; i < L.length; i++)
printf("%3d", L.a[i]);
printf("\n");
if (!DeleteOpenInterVal(L, 3, 7))
printf("错误\n");
printf("线性表长度为:%d\n", L.length);
for (int i = 0; i < L.length; i++)
printf("%3d", L.a[i]);
printf("\n");
return 0;
}
/*
我理解的题意是删除(s,t)内的元素不包含端点值s与t,
但是视频中讲解的是包括端点值属于删除闭区间内的数据元素
此处代码中就是删除开区间内的元素,若需删除闭区间应该将不等关系修改就🆗
*/
5.从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素,如果s和t不合理或者顺序表为空则显示出错信息并退出运行。
/*
从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素,
如果s和t不合理或者顺序表为空则显示出错信息并退出运行。
*/
#include <stdio.h>
#define Max 50
typedef struct SqList {
int a[Max] = { 4,1,2,5,0,0,3 };
int length = 7;
}SqList;
//closed interval 闭区间
bool DeleteClosedInterval(SqList& L, int s, int t)
{
if (L.length == 0 || s >= t)
return false;
int count = 0; //记录[s,t]区间内的数据元素的个数
bool flag = false; //用来判断是否存在>s的数据
for (int i = 0; i < L.length; i++)
{
if (L.a[i] >= s)
{
flag = true;
break;
}
}
if (!flag)
return false;
for (int i = 0; i < L.length; i++)
{
if (L.a[i] >= s && L.a[i] <= t)
count++;
else
L.a[i - count] = L.a[i];
}
L.length = L.length - count;
return true;
}
int main()
{
SqList L;
for (int i = 0; i < L.length; i++)
printf("%3d", L.a[i]);
printf("\n");
if (!DeleteClosedInterval(L, 3, 5))
printf("错误\n");
for (int i = 0; i < L.length; i++)
printf("%3d", L.a[i]);
printf("\n");
return 0;
}
6.从有序顺序表中删除所有其值重复的元素,是表中所有元素的值均不同。
/*
从有序顺序表中删除所有其值重复的元素,是表中所有元素的值均不同。
*/
#include <stdio.h>
#define Max 50
typedef struct SqList {
int a[Max] = { 2,2,3,3,3,5,6,6,7 };
int length = 9;
}SqList;
void deleteRepeatValue(SqList& L)
{
int