/**
*综合应用题
*/
#include<iostream>
#define maxsize 100
#define ElemType int
using namespace std;
typedef struct{
ElemType data[maxsize];
int length;
}list;
//初始化创建顺序表
void initList(list &l){
for(int i = 0; i < 5; i++){
l.data[i] = i+1;
}
l.length = 5;
}
//输入n个顺序表的元素,创建一个顺序表
void createList(list &L, ElemType n){
for(int i = 0; i < n; i++){
cin>>L.data[i];
}
L.length = n;
}
//输出所有的元素
void printList(list &l){
for(int i = 0; i < l.length; i++){
cout<<l.data[i]<<" ";
}
cout<<endl;
}
/**
* 题目 1:
*从顺序表当中删除具有最小值的元素(假设唯一),并由函数返回被删元素的值,
*空出的位置由最后一个元素填补。若顺序表为空,则显示出错信息并退出运行。
*/
int deleteListMin(list &l){
if(l.length == 0){
return false;
}
int min = l.data[0];
int pos = 0;
for(int i = 1; i < l.length; i++){
if(l.data[i] < min){
min = l.data[i];
pos = i;
}
}
l.data[pos] = l.data[l.length-1];
l.length--;
return min;
}
/**
* 题目 2:
*设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为o(1).
*/
bool reverseList(list &l){
int len = l.length;
if(len == 0){
return false;
}
int i = 0;
while(i < len/2){
int temp = l.data[i];
l.data[i] = l.data[len-1-i];
l.data[len-1-i] = temp;
i++;
}
return true;
}
/**
* 题目 3:
*对长度为 n的顺序表L, 编写一个时间复杂度为o(n),空间复杂度为o(1),
*的算法,该算法删除线性表中所有值为x的数据元素。
*/
void deleteAllElement(list &l, ElemType x){
int len = l.length, k = 0;
for(int i = 0; i < len; i++){
if(l.data[i]==x){
k++;
}
l.data[i] = l.data[i+k];
}
l.length -= k;
}
/**
* 题目 4:
* 从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,
* 若s或t不合理或顺序表为空,则显示出错信息并退出运行。
*/
void deleteStoT(list &l, ElemType s, ElemType t){
int len = l.length, k = 0;
for(int i = 0; i < len; i++){
l.data[i] = l.data[i+k];
if(l.data[i] >= s && l.data[i] <= t){
k++;
i--;
}
}
l.length -= k;
}
/**
* 题目 5:
* 从顺序表中删除其值在给定s与t之间(包含s和t,要求s<t)的所有元素,
* 若s或t不合理或顺序表为空,则显示出错信息并退出运行。
* 和题目4差不多,懒得写了。
*/
/**
* 题目 6:
* 从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
*/
void deleteRepList(list &l){
int len = l.length, k = 0;
for(int i = 1; i < len-k; i++){
l.data[i] = l.data[i+k];
if(l.data[i] == l.data[i-1]){
k++;
i--;
}
}
l.length -= k;
}
/**
* 题目 7:
* 将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
* 注:这里没有提从小到大还是从大到小,默认从小到大。
*/
bool mergeList(list &l1, list &l2, list &l3){
int i = 0, j = 0, k = 0;
while(i < l1.length && j < l2.length){
if(l1.data[i]<l2.data[j]){
l3.data[k] = l1.data[i];
i++;
}else{
l3.data[k] = l2.data[j];
j++;
}
k++;
}
while(i < l1.length){
l3.data[k] = l1.data[i];
k++;i++;
}
while(j < l2.length){
l3.data[k] = l2.data[j];
k++;j++;
}
l3.length = k;
}
/**
* 题目 8:
* 已知在一维数组
* 待更新中。。。。。。
*/
int main(){
list l;
initList(l);
cout<<"顺序表创建成功:";
printList(l);
// cout<<"问题1测试最小值:";
// cout<<deleteListMin(l)<<endl;
// cout<<" 此时顺序表为:";
// printList(l);
// cout<<"问题2测试逆置顺序表";
// reverseList(l);
// printList(l);
// cout<<"问题3删除所有与x相等的元素:"<<endl;
// l.data[4] = 3;
// l.length++;
// cout<<" 当前元素有:";
// printList(l);
// cout<<" 删除后有:";
// deleteAllElement(l,3);
// printList(l);
// cout<<"问题4删除指定区间的值:"<<endl;
// deleteStoT(l,1,3);
// printList(l);
// cout<<"问题6测试:"<<endl;
// l.data[5] = 5;
// l.length++;
// printList(l);
// deleteRepList(l);
// printList(l);
cout<<"问题6测试:";
list l1,l2,l3;
createList(l1,3);
createList(l2,5);
mergeList(l1,l2,l3);
printList(l3);
return 0;
}
王道数据结构_第二章线性表_综合应用题
最新推荐文章于 2024-08-13 18:50:49 发布