编程题实训-顺序表应用

这篇具有很好参考价值的文章主要介绍了编程题实训-顺序表应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

详解版 

第1关:删除顺序表中指定值的所有元素

  • 任务要求
  • 参考答案
  • 评论2
  • 关卡排行榜
  • 任务描述
  • 编程要求
    • 输入
    • 输出
  • 测试说明
  • 来源

任务描述

本关任务:利用顺序表表示一个包括n个整数的序列,请实现一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法可以删除表中所有值为item的元素。

编程要求

输入

多组数据,每组数据有三行,第一行为顺序表的长度n,第二行为顺序表的n个元素(元素之间用空格分隔),第三行为待删除的元素的值item。当n=0时输入结束。

输出

对于每组数据分别输出一行,依次输出删除值为item的元素后顺序表中的剩余元素,元素之间用空格分隔。

测试说明

平台会对你编写的代码进行测试:

测试输入: 5 44 11 22 33 22 11 6 22 33 11 33 33 55 33 0

预期输出: 44 22 33 22 22 11 55

#include<iostream>
//"	iostream:用于处理标准输入输出流,例如cin和cout。
#define MAXSIZE 100
using namespace std;
typedef struct{
    int *elem;       //存储空间的基地址
    int length;      //当前长度
}SqList;
void InitList_Sq(SqList &L,int n){
    //构造顺序表
    L.elem=new int[MAXSIZE];    //为顺序表分配一个大小为MAXSIZE的数组空间
    L.length=n;            //空表长度为0
}
void DeleteItem(SqList &A,int item){
    /**************begin************/
    //删除顺序表A中所有值为item的元素
   //思路1,找到并记录所有值为item的元素的位置,再输出,比较麻烦
   //思路2,找到不为item的值,找到一个存一个,较为简单
   //一般来说,用的变量少会简单点,多找规律
   int num = 0;
   for(int i=0;i<=A.length-1;i++){
       if(A.elem[i]!=item){
           A.elem[num] = A.elem[i];
           num++;
       }  
   }
    A.length = num;



   
    /**************end************/
}
void PrintA(SqList A)
{//输出数组元素
    for(int i=0;i<A.length-1;i++)
        cout<<A.elem[i]<<" ";
    cout<<A.elem[A.length-1]<<endl;
}
int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0) break;
        SqList A;
        InitList_Sq(A,n);
        for(int i=0;i<n;i++)
            cin>>A.elem[i];
        int item;
        cin>>item;
        DeleteItem(A,item);
        PrintA(A);
    }
    return 0;
}

第2关:求解两个升序序列的中位数 

任务描述

本关任务:一个长度为L(L≥1)的升序序列S,处在第L/2(若为小数则去掉小数后加1)个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现有两个等长升序序列A和B,试实现一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。

编程要求

输入

多组数据,每组数据有三行,第一行为序列的长度n,第二行为序列A的n个元素,第三行为序列B的n个元素(元素之间用空格分隔)。当n=0时输入结束。

输出

对于每组数据分别输出两个序列的中位数,占一行。

注意 2n 要写成 2*n,小编在这里卡了半个小时,怀疑人生QAQ,还有

#include <iostream>
using namespace std;
void Input(int a[],int n)
{//读入序列
    for(int i=0;i<n;i++)
        cin>>a[i];
}
int Search_Mid(int A[],int B[],int n)
{//求解两个升序序列的中位数
/**************begin************/
  //分析题目,处在第L/2(若为小数则去掉小数后加1)个位置的数称为S的中位数。
  // 式子可以为 (m + n + 1) / 2;但本题为两个等长序列,不用考虑
  //思路:拼接并输出一个新的有序序列
  int i;
  int j;
  int c[2*n];
  for(i=0;i<n;i++){
      c[i] = A[i];
  }
  for(i=0;i<n;i++){
      c[n+i] = B[i];
  }
  for(i=0;i<2*n-1;i++){
      for(int j = i+1;j<=2*n-1;j++){
          if(c[i] > c[j]){
              int temp = c[i];
              c[i] = c[j];
              c[j] = temp;
          }
      }
  }

  return c[n-1];



  
    /**************end************/
}
int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0) break;
        int A[n],B[n];
        Input(A,n);
        Input(B,n);
        cout<<Search_Mid(A,B,n)<<endl;
    }
    return 0;
}

也可以参考别人提供的答案,要解析的话扣1(已改)文章来源地址https://www.toymoban.com/news/detail-851307.html

#include<iostream>
using namespace std;
void Input(int t[],int n){
    for(int i=0;i<n;i++)
        cin>>t[i];
}

void Find(int A[], int B[], int n) { // 定义一个名为Find的函数,接收两个int类型的数组A和B以及一个int类型的n。  
    int h1=0, e1=n-1, h2=0, e2=n-1; // 初始化四个变量,h1和h2表示数组A的起始和结束位置,e1和e2表示数组B的起始和结束位置。  
  
    while(h1<e1&&h2<e2) { // 当两个数组都还有元素未被比较时,循环继续。  
  
        int a=(h1+e1)/2; // 找到数组A的中点。  
        int b=(h2+e2)/2; // 找到数组B的中点。  
  
        if(A[a]==B[b]) { // 如果两个中点元素相等。  
            cout<<A[a]<<endl; // 输出这个元素。  
            return; // 结束函数。  
        }   
  
        else if(A[a]<B[b]) { // 如果A的中点元素小于B的中点元素。  
            if((e1-h1)%2==0) h1=a; // 如果A的右半部分已经处理完(即e1-h1是偶数),则新的h1为当前的中点。  
            else h1=a+1; // 如果A的右半部分还没处理完(即e1-h1是奇数),则新的h1为当前中点+1。  
            e2=b; // 将e2更新为当前的中点。  
        }   
  
        else if(A[a]>B[b]) { // 如果A的中点元素大于B的中点元素。  
            if((e2-h2)%2==0) h2=b; // 如果B的右半部分已经处理完(即e2-h2是偶数),则新的h2为当前的中点。  
            else h2=b+1; // 如果B的右半部分还没处理完(即e2-h2是奇数),则新的h2为当前中点+1。  
            e1=a; // 将e1更新为当前的中点。  
        }  
    }  
  
    if(A[e1]<B[e2]) cout<<A[e1]<<endl; // 如果A的最后一个元素小于B的最后一个元素,输出A的最后一个元素。  
    else cout<<B[e2]<<endl; // 否则,输出B的最后一个元素。          
}

int main(){
    int n;
    while(cin>>n&&n!=0){
        int A[1000];
        int B[1000];
        Input(A,n);
        Input(B,n);
        Find(A,B,n);
    }
    return 0;
}

到了这里,关于编程题实训-顺序表应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】:顺序表及其通讯录应用

    1.1为什么会存在数据结构? 我们常常接触到诸如生活中的姓名、身份证、网页内的图片、视频等各种各样的信息,这些信息就是我们常说的数据。在使用这些数据时,我们发现随着数据的增加,当我们要单独寻找某一个数据时就会非常困难,就像图书馆内书籍如果没有按一定

    2024年04月26日
    浏览(39)
  • 【数据结构|C语言版】顺序表应用

    上期回顾: 【数据结构|C语言版】顺序表 个人主页: C_GUIQU 各位小伙伴大家好!上期小编给大家讲解了数据结构中的顺序表,接下来讲讲顺序表该如何应用。 (1)能够保存联系人的姓名、年龄、性别、电话、住址 (2)添加联系人信息 (3)删除联系人信息 (4)修改联系人信

    2024年04月16日
    浏览(28)
  • 【数据结构】顺序表:与时俱进的结构解析与创新应用

      欢迎来到白刘的领域     Miracle_86.-CSDN博客           系列专栏     数据结构与算法 先赞后看,已成习惯    创作不易,多多支持! 目录 一、数据结构的概念 二、顺序表(Sequence List) 2.1 线性表的概念以及结构 2.2 顺序表分类 2.2.1 顺序表和数组的区别 2.2.2 顺序表的分类

    2024年04月23日
    浏览(28)
  • 数据结构从入门到实战——顺序表的应用

    目录 一、基于动态顺序表实现通讯录 二、代码实现 2.1 通讯录的初始化 2.2 通讯录的销毁  2.3 通讯录的展示 2.4 通讯录添加联系人信息 2.5 通讯录删除联系人信息 2.6 通讯录修改联系人信息  2.7 通讯录的查找联系人信息 2.8 将通讯录中联系人信息保存到文件中  2.9 从文件中

    2024年04月25日
    浏览(35)
  • 【(数据结构) —— 顺序表的应用-通讯录的实现】

    C语言基础要求:结构体、动态内存管理、顺序表、文件件操作 (1). 功能要求 1)至少能够存储100个人的通讯信息 2)能够保存用户信息:名字、性别、年龄、电话、地址等 3)增加联系人信息 4)删除指定联系人 5)查找制定联系人 6)修改指定联系人 7)显示联系人信息 (2).重

    2024年02月08日
    浏览(48)
  • 数据结构学习之顺序栈应用的案例(有效的括号)

    实例要求: 给定一个 只包括 \\\'(\\\',\\\')\\\',\\\'{\\\',\\\'}\\\',\\\'[\\\',\\\']\\\' 的 字符串 s , 判断字符串是否有效 ; 有效字符串需满足的条件: 1、左括号必须 用相同类型的右括号 闭合; 2、左括号必须 以正确的顺序闭合 ; 3、每个右括号都有一个 对应的相同类型 的左括号; 相关案例: 实例分

    2024年01月21日
    浏览(50)
  • 【数据结构与算法】之8道顺序表与链表典型编程题心决!

                                                                                    个人主页:秋风起,再归来~                                                                                             数据结构与算

    2024年04月14日
    浏览(57)
  • 【第9关:基于邻接表的边的删除】【编程题实训-图】【头歌】【bjfu-280】

    给定一个无向图,在此无向图中删除一条边。 输入 多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有两个数字f和g,代表删除的边所依附的两个顶点。当n和m都等于

    2024年02月04日
    浏览(39)
  • 【 第4关:入栈和出栈的基本操作】【编程题实训-栈】【头歌】【bjfu-243】

    本关任务:输入一个整数序列a1,a2,a3…,an。当ai不等于-1时将ai进栈;当ai=-1时,输出栈顶元素并将其出栈。 输入 多组数据,每组数据有两行,第一行为序列的长度n,第二行为n个整数,整数之间用空格分隔。当n=0时输入结束。 输出 对于每一组数据输出若干行。每行为相应的出

    2024年02月06日
    浏览(42)
  • 数据结构入门(C语言版)二叉树的顺序结构及堆的概念及结构实现应用

    普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用 顺序结构的数组来存储 ,需要注意的是 这里的堆和操作系统虚拟进程地址空间中的堆是两回事 ,一个是 数据结构 ,一

    2023年04月19日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包