求问一道超难的C语言题

2025-04-08 03:51:56
推荐回答(1个)
回答1:

#include
#include
#include
#define ARR_SIZE 20  //array数组大小 
int getkey(int key[]);
int getarray(int array[]);
int insert(int array[],int key,int vol);
int result(int flag);
int main()
{
    int M,n,flag,vol;
    int array[ARR_SIZE];
    int *key;
    memset(array,0,sizeof(array));//初始化数组为0 
    printf("请输入M:\n");
    scanf("%d",&M);
    while(M)//循环M次 
    {
        getarray(array);
        printf("请输入n:\n");
        scanf("%d",&n);
        key=(int *)malloc(n);//根据输入n申请数组大小 
        //将数组大小放入数组首位,主要由于你给的 getkey(int key[])只
        //有一个参数,无法传递数组大小,因此放到手位置传递 
        key[0]=n;
        getkey(key);
        for(int i=0;i!=n;i++)//key[]中有n个值,因此n次判断 
        {
            result(insert(array,key[i],ARR_SIZE));
        }
        memset(array,0,sizeof(array));//清空数组,为下次数据准备 
        M--;
    }
}

int getarray(int array[])
{
    printf("\n请输入array[](<=%d):\n",ARR_SIZE);
    int tmp,i=0;
    while(1)
    {
        scanf("%d",&tmp);
        if(tmp==0)
            return 0;
        array[i]=tmp;
        i++;
    }
}

int getkey(int key[])
{
    int num=key[0];
    for(int i=0;i!=num;i++)
        scanf("%d",key++);
}

int insert(int array[],int key,int vol)
{
    int now_size=0,p=0;
    for(int i=0;i!=ARR_SIZE;i++) 
    {
        if(array[i])     
            now_size++;//统计array[]数组值的个数 
        if(array[i]==key)
            return -2;//    The key is already in this array!
        if(key>array[i]&&array[i])
            p++;    //该位置就是需要插入的位置 
    }
    if(now_size==ARR_SIZE)
        return -1;//The array if full!
    for(int i=now_size;i>=p;i--)
        array[i+1]=array[i];
    array[p]=key;
    return p;    //返回插入位置 
}

int result(int flag)
{
    if(flag==-1)
        printf("The array if full!  ");
    else if(flag==-2)
        printf("The key is already in this array!  ");
    else
        printf("The key  is inserted in position %d  ",flag);
}

昨天写好没测试,今天测了才发给你。这道题目确实不难,只是题目长。另外关于输出格式有点含糊,如果我理解有偏差,你看了我的代码改下就好。主要逻辑都已经实现了。