顺序存储——查最小值,删除区间,合并数据,删除重复,约瑟夫问题

一、问题描述

用顺序存储实现

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:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值