一、问题描述
用顺序存储实现
1、从线性表中删除最小值的元素,空出的位置由最后一个元素的值填补;
2、从线性表中删除其值在给定区间s与t内的所有元素;
3、将两个有序线性表合并为一个有序线性表;
4、从线性表中删除所有值重复的元素;
5、约瑟夫问题利用顺序存储解决。
二、代码实现
#include <iostream>
using namespace std;
#define MAXS 100
typedef struct{
int n;
}Num;
typedef struct{
Num *elem;
int length;
}Excel;
void fun1();
void fun2();
void fun3();
void fun4();
void fun5();
int main()
{
cout<<"\n (1) 删除最小值,用末尾元素填补\n"<<" (2) 删除区间s~t内的所有元素\n"
<<" (3) 有序线性表合二为一\n"<<" (4) 删除重复值\n"
<<" (5) 约瑟夫问题顺序储存\n"<<" (0) 退出\n\n";
cout<<"请输入操作数:";
int num;
cin>>num;
switch(num){
case 1:fun1();
break;
case 2:fun2();
break;
case 3:fun3();
break;
case 4:fun4();
break;
case 5:fun5();
break;
case 0: break;
}
return 0;
}
void fun1(){ //(1)删除最小值,用末尾元素填补
Excel L1;
L1.elem=new Num[MAXS];
L1.length=0;
cout<<"请输入数字,以“0”作为结束\n";
for(int i=0;i<MAXS;i++){
cin>>L1.elem[i].n;
if(!L1.elem[i].n)break;
else L1.length++;
}
int temp=L1.elem[0].n;
for(int j=1;j<L1.length;j++){
if(temp>L1.elem[j].n)
temp=L1.elem[j].n;
}
int k=0;
while(k<L1.length){
if(L1.elem[k].n==temp)
L1.elem[k].n=L1.elem[L1.length-1].n;
cout<<L1.elem[k].n<<" ";
k++;
}
}
void fun2(){ //(2)删除区间s~t内的所有元素
Excel L2;
L2.elem=new Num[MAXS];
L2.length=0;
cout<<"请输入数字,以“0”作为结束\n";
for(int i=0;i<MAXS;i++){
cin>>L2.elem[i].n;
if(!L2.elem[i].n)break;
else L2.length++;
}
cout<<"共有"<<L2.length<<"个数,请输入删除区间S~T:";
int S,T,j;
cin>>S>>T;
if(T-S+1>L2.length-T)j=T-S+1;
else j=L2.length-T;
L2.length-=T-S+1;
for(int i=S-1;i<S+j-1;i++){
L2.elem[i].n=L2.elem[T].n;
T++;
}
int k=0;
while(k<L2.length){
cout<<L2.elem[k].n<<" ";
k++;
}
}
void fun3(){ //(3)有序线性表合二为一
Excel L3,L3_1,L3_2;
L3.elem=new Num[MAXS];
L3_1.elem=new Num[MAXS];
L3_2.elem=new Num[MAXS];
L3.length=L3_1.length=L3_2.length=0;
cout<<"请从小到大输入数字,以“0”作为结束\n";
for(int i=0;i<MAXS;i++){
cin>>L3_1.elem[i].n;
if(!L3_1.elem[i].n)break;
else L3_1.length++;
}
cout<<"请再次从小到大输入数字,以“0”作为结束\n";
for(int i=0;i<MAXS;i++){
cin>>L3_2.elem[i].n;
if(!L3_2.elem[i].n)break;
else L3_2.length++;
}
int i=0,j=0,k=0;
while(i<L3_1.length&&j<L3_2.length){
if(L3_1.elem[i].n>L3_2.elem[j].n){
L3.elem[k].n=L3_2.elem[j].n;
j++;
}
else{
L3.elem[k].n=L3_1.elem[i].n;
i++;
}
k++;
L3.length++;
}
if(i==L3_1.length)
for(;j<L3_2.length;j++){
L3.elem[k].n=L3_2.elem[j].n;
k++;
L3.length++;
}
else{
for(;i<L3_1.length;i++){
L3.elem[k].n=L3_1.elem[i].n;
k++;
L3.length++;
}
}
cout<<"有序表合并后为:\n";
k=0;
while(k<L3.length){
cout<<L3.elem[k].n<<" ";
k++;
}
}
void fun4(){ //(4)删除重复值
Excel L4;
L4.elem=new Num[MAXS];
L4.length=0;
cout<<"请输入数字,以“0”作为结束\n";
for(int i=0;i<MAXS;i++){
cin>>L4.elem[i].n;
if(!L4.elem[i].n)break;
else L4.length++;
}
int Rem[50],n=0;
for(int j=0;j<L4.length;j++){
if(L4.elem[j].n!=0)
for(int k=j+1;k<L4.length;k++)
if(L4.elem[j].n==L4.elem[k].n){
L4.elem[k].n=0;
Rem[n]=k;
n++;
}
else continue;
}
int i,j,temp,k;
for(i=1;i<=n;i++)
for(j=0;j<n-i;j++){
if(Rem[j]>Rem[j+1]){
temp=Rem[j];
Rem[j]=Rem[j+1];
Rem[j+1]=temp;
}
}
j=Rem[0];
while(j<L4.length-1){
L4.elem[j].n=L4.elem[j+1].n;
j++;
}
L4.length--;
for(k=1;k<n;k++){
j=Rem[k]-k;
while(j<L4.length-1){
L4.elem[j].n=L4.elem[j+1].n;
j++;
}
L4.length--;
}
k=0;
while(k<L4.length){
cout<<L4.elem[k].n<<" ";
k++;
}
}
void fun5(){ //(5) 约瑟夫问题顺序储存
Excel L5;
L5.elem=new Num[MAXS];
L5.length=0;
cout<<"请输入数字,以“0”作为结束\n";
for(int i=0;i<MAXS;i++){
cin>>L5.elem[i].n;
if(!L5.elem[i].n)break;
else L5.length++;
}
cout<<"请输入筛选数:";
int Select,j,k=0;
cin>>Select;
while(L5.length){
j=1;
while(j!=Select){
k++;
j++;
if(k>=L5.length)k=0;
}
cout<<L5.elem[k].n<<" ";
for(int i=k;i<L5.length;i++)
L5.elem[i].n=L5.elem[i+1].n;
L5.length--;
if(k>=L5.length)k=0;
}
}
三、实例演示
问题1: 问题2:
问题3: 问题4:
问题5: