关于##在有序表中插入一个元素##的问题,如何解决?(数据结构)

表中数据元素的数据类型为整型,按有序方式(从小到大)输入表中初始元素,再输入一个整数,以空格隔开,若有序表中已有该元素则退出,否则将整数插入到有序表中的正确位置,使其仍然有序。
输入描述:输入有序表中元素的个数 n,占一行; 按从小到大的顺序输入 n 个整数,以空格隔开,占一行; 输入待插入元素 x,占一行。
输出描述:输出有序表,以空格隔开,最后一个整数后面要求有空格。
输入样例1:
6
1 3 5 9 11 13
4
输出样例1:
1 3 4 5 9 11 13

输入样例2:
3
4 5 6
6
输出样例2:
4 5 6
补全如下代码

#include<stdio.h>
#define MAX_SIZE 50
int main()
{
    int n, x, num;
    scanf("%d", &n);
    num = n;
    int a[MAX_SIZE];
    for(int i=0;i<n;i++)
        scanf("%d", &a[i]);
    scanf("%d", &x);
    for(int j=0;j<n;j++)
    {   
        if(x > a[n-1])     //插入表尾 
        {
            /***********Begin***********/


            /************End************/ 
        }
        if(x == a[j])      //有相同元素,退出循环 
            break;  
        if(x < a[j])      //插入顺序表
        {
            /***********Begin***********/


            /************End************/         
        }
    }
    if(num > n)
        for(int i=0;i<n+1;i++)
            printf("%d ", a[i]);
    else
        for(int i=0;i<n;i++)
            printf("%d ", a[i]);
    return 0;
}

不要修改原代码,不要删除注释

代码如下:

#include<stdio.h>
#define MAX_SIZE 50
int main()
{
    int n, x, num;
    scanf("%d", &n);
    num = n;
    int a[MAX_SIZE];
    for(int i=0;i<n;i++)
        scanf("%d", &a[i]);
    scanf("%d", &x);
    for(int j=0;j<n;j++)
    {   
        if(x > a[n-1])     //插入表尾 
        {
            /***********Begin***********/
            a[n] = x;
            num++;
            break;

            /************End************/ 
        }
        if(x == a[j])      //有相同元素,退出循环 
            break;  
        if(x < a[j])      //插入顺序表
        {
            /***********Begin***********/
            for(int k = n;k>j;k--)
                a[k] = a[k-1];
            a[j]=x;
            num++;
            break;

            /************End************/         
        }
    }
    if(num > n)
        for(int i=0;i<n+1;i++)
            printf("%d ", a[i]);
    else
        for(int i=0;i<n;i++)
            printf("%d ", a[i]);
    return 0;
}


引用 皆我百晓生 小程序回复内容作答:

补全代码如下:

#include<stdio.h>
#define MAX_SIZE 50
int main()
{
    int n, x, num;
    scanf("%d", &n);
    num = n;
    int a[MAX_SIZE];
    for(int i=0;i<n;i++)
        scanf("%d", &a[i]);
    scanf("%d", &x);
    for(int j=0;j<n;j++)
    {   
        if(x > a[n-1])     //插入表尾 
        {
            a[n] = x;
            n++;
            break;
        }
        if(x == a[j])      //有相同元素,退出循环 
            break;  
        if(x < a[j])      //插入顺序表
        {
            for(int k=n-1;k>=j;k--)
                a[k+1] = a[k];
            a[j] = x;
            n++;
            break;
        }
    }
    if(num > n)
        for(int i=0;i<n+1;i++)
            printf("%d ", a[i]);
    else
        for(int i=0;i<n;i++)
            printf("%d ", a[i]);
    return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

【相关推荐】



  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7644979
  • 除此之外, 这篇博客: 回溯法与分支限界法的总结中的 在当前节点(扩展节点)处,先生成其所有的子节点(分支),然后再从当前的活节点(当前节点的子节点)表中选择下一个扩展节点。为了有效地选择下一个扩展节点,加速搜索的进程,在每一个活节点处,计算一个函数值(限界),并根据函数值,从当前活节点表中选择一个最有利的节点作为扩展节点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。分支限界法解决了大量离散最优化的问题。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    编写回溯算法代码时,要先考虑这个问题是一个什么搜索树,然后套用那个搜索树模板就行了。(例如:子集树就是:判断是否满足约束条件——计算、x[i]=1——递归左子树——归还——x[i]=0、递归右子树(注意限界思想))
    (例如:排列树就是:循环——判断是否满足约束条件——交换——计算——递归(注意限界思想)——归还)
    当然具体算法要具体分析
    还要注意及时更新解和存储解,别忘了进入右子树、循环结束前,要将你算的、交换过的东西,要归还回去。注意到达叶结点干什么,没有到达怎么做

    而分支限界算法的代码编写,首先编写三个类:活结点类、活结点属性类、入队类。然后选择好什么样的队列方式。一定要考虑好属性,然后什么时候添加结点、以及出队、和存储最优解

    两个算法编写,还要注意限界函数的设置,怎么设计一个好的代价函数可以裁掉更多的空间。这就是两个算法的优化思想。

    当然最重要的还要考虑好约束条件。

    具体逻辑代码还是多写多练。多去总结。这里也就只讲个大体思路。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^