鱼C论坛

 找回密码
 立即注册
查看: 989|回复: 1

[已解决]数组的动态存储,排序,查找

[复制链接]
发表于 2020-10-30 21:27:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求教C语言内,我想实现的功能是———输入任意个字符(动态存储),随着输入数字的个数,开辟一个输进数字临时的存储空间,想输多少就开辟多少,形成数组后,
然后从大到小排序,排序完后,输入任意数判断是否在数组内,如在则输出下标。


我现在遇到的问题是:1)没错误,但不知道如何跳出输入循环,输入到一定数后程序运行不了
2)这种存储是不是要使用malloc 单个存储,输一个创造一个存储单元,然后保存;我用calloc一次性开辟多个存储单元,感觉怪怪的
能帮我实现这个功能吗?谢谢啦!
#include<stdio.h>
#include<stdlib.h>                                                               
                                                                                                       
                                                                                                       
                                                                                                       
int Search(int arr[], int key,int left,int right)                                                //二分法的函数部分;
{                                                                                                        //将要找的数字与中间的数字进行比较,比较后将下标移动
        while (left <= right)                                                                        //比较部分是数字,改变部分是下标
{
int mid =left + (right-left) / 2;//中间下标的计算
if (arr[mid]>key)//将想要找的数与中间数作比较
{
        right = mid-1;//改变下标;下同
}
                else if (arr[mid] <key)
                {
                        left = mid+1;
                }
                        else
                {
                        return mid;//判断完后将中间下标对应的数字筛选出来
                }
}
return -1;

}


void Rank(int arr[],int i)
{
        int j,k,t;
        for(j=0;j<i;j++)                                        //输入任意数形成数组,然后由大到小排列(冒泡法函数)
                for(k=0;k<i-j;k++)
                        if(arr[k]<arr[k+1])
                        {
                                t=arr[k];
                                arr[k]=arr[k+1];  
                                arr[k+1]=t;
                        }
                        for(j=0;j<9;j++)
                        {
                                printf("%d ",arr[j]);
                        }
}

void main()
{
        int i,j,k,t,n,m,a[10],g;
        int left = 0;
        int right;
        int *p;
       
        printf("please enter any datas:\n");

        for(i=0;;i++)
        {       
                p=(int *)calloc(i,sizeof(int));        //分配多个存储单元,每个字节单员的字节数
                scanf("%d",&a[i]);
                *p=a[i];
                p++;
        }
        right=i;
        p-=i;
        j=i;
        for(i=0;i<=j;i++)
        {
                printf("%d ",*p++);
        }
        p-=i;
        free(p);
        Rank(a,j);
       

        for(i=0;i<j;i++)
        {
                printf("%d\n ",a[i]);
        }
        scanf("%d", &n);                //输入任意数判断是否在数组内,如在则输出下标                                                  //函数部分
     g=Search(a,n,left,right);
        {

                if (-1==g)
                {
                        printf("找不到\n");
                }
                else
                {
                        printf("找到了,下标是:%d\n",g);
                }
        }
       
}




最佳答案
2020-10-31 11:43:38
#include<stdio.h>
#include<stdlib.h>

#define ARRAY_SIZE        (10)

//有序数列的二分查找
int * SearchData(int arr[],int key,int i)
{
        int mid = i/2;

        if(i <= 0)
        {
                return 0;
        }
        
        if(key == arr[mid])
        {
                return &arr[mid];
        }

        if(key > arr[mid])
        {
            return SearchData(arr,key,mid);
        }
        else
        {
                return SearchData(&arr[mid+1],key,mid-1);
        }
}

int newSearch(int arr[],int key,int i)
{
        int * p = SearchData(arr,key,i);

        if(p == 0)
        {
                return -1;
        }
        else
        {
                return p - arr;
        }
}


//你这个查找函数有问题,总是找不到,没有给你改了,写了一个新的查找
int Search(int arr[], int key,int left,int right)                                                //二分法的函数部分;
{                                                                                                        //将要找的数字与中间的数字进行比较,比较后将下标移动
        while (left <= right)                                                                        //比较部分是数字,改变部分是下标
        {
                int mid =left + (right-left) / 2;//中间下标的计算
                if (arr[mid]>key)//将想要找的数与中间数作比较
                {
                        right = mid-1;//改变下标;下同
                }
                else if (arr[mid] <key)
                {
                        left = mid+1;
                }
                else
                {
                        return mid;//判断完后将中间下标对应的数字筛选出来
                }
        }
        return -1;
}

void Rank(int arr[],int i)
{
        int j,k,t;

        for(j=0;j<i;j++)                                        //输入任意数形成数组,然后由大到小排列(冒泡法函数)
                for(k=0;k<i-j;k++)
                        if(arr[k]<arr[k+1])
                        {
                                t=arr[k];
                                arr[k]=arr[k+1];  
                                arr[k+1]=t;
                        }
}

//动态分配内存输入数据函数
int InputData(int **p)
{
        int count = 0;
        int memsize = ARRAY_SIZE;

        //初始分配10个int 
        int * arr = (int *)malloc(ARRAY_SIZE * sizeof(int));
        
        printf("循环一个数字,输入数字 0 结束输入!\n");

        while(arr != 0)
        {
                //输入一个数字
                scanf("%d",&arr[count]);
                
                //输入 0 结束循环
                if(arr[count++] == 0)
                {
                        break;
                }
                
                //当输入的数字个数等于已分配内存大小时,重新分配内存
                if(count >= memsize)
                {
                        memsize += ARRAY_SIZE;
                        arr = (int *)realloc(arr,memsize * sizeof(int));
                }
        }
        
        * p = arr;

        return count;
}

void main()
{
        int i,j,k,t,n,m,a[10],g;
        int left = 0;
        int right;
        int *p;

        printf("please enter any datas:\n");
        
        //动态分配的数组 p ,不需要a[10]了;
        i = InputData(&p);

/*
        for(i=0;;i++)
        {       
                p=(int *)calloc(i,sizeof(int));        //分配多个存储单元,每个字节单员的字节数
                scanf("%d",&a[i]);
                *p=a[i];
                p++;
        }
*/
        right=i;
        j=i;

        for(i=0;i<j;i++)
        {
                printf("%d ",p[i]);
                //printf("%d ",*p++);
        }

        printf("\n");
//        p-=i;
//        free(p);
        Rank(p,j);


        for(i=0;i<j;i++)
        {
                printf("%d ",p[i]);
        }
        printf("\n");

        scanf("%d", &n);                //输入任意数判断是否在数组内,如在则输出下标                                                  //函数部分
        //
        //g=Search(p,n,left,right);
        g=newSearch(p,n,right);
        if (-1==g)
        {
                printf("找不到\n");
        }
        else
        {
                printf("找到了,下标是:%d\n",g);
        }

        free(p);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-31 11:43:38 | 显示全部楼层    本楼为最佳答案   
#include<stdio.h>
#include<stdlib.h>

#define ARRAY_SIZE        (10)

//有序数列的二分查找
int * SearchData(int arr[],int key,int i)
{
        int mid = i/2;

        if(i <= 0)
        {
                return 0;
        }
        
        if(key == arr[mid])
        {
                return &arr[mid];
        }

        if(key > arr[mid])
        {
            return SearchData(arr,key,mid);
        }
        else
        {
                return SearchData(&arr[mid+1],key,mid-1);
        }
}

int newSearch(int arr[],int key,int i)
{
        int * p = SearchData(arr,key,i);

        if(p == 0)
        {
                return -1;
        }
        else
        {
                return p - arr;
        }
}


//你这个查找函数有问题,总是找不到,没有给你改了,写了一个新的查找
int Search(int arr[], int key,int left,int right)                                                //二分法的函数部分;
{                                                                                                        //将要找的数字与中间的数字进行比较,比较后将下标移动
        while (left <= right)                                                                        //比较部分是数字,改变部分是下标
        {
                int mid =left + (right-left) / 2;//中间下标的计算
                if (arr[mid]>key)//将想要找的数与中间数作比较
                {
                        right = mid-1;//改变下标;下同
                }
                else if (arr[mid] <key)
                {
                        left = mid+1;
                }
                else
                {
                        return mid;//判断完后将中间下标对应的数字筛选出来
                }
        }
        return -1;
}

void Rank(int arr[],int i)
{
        int j,k,t;

        for(j=0;j<i;j++)                                        //输入任意数形成数组,然后由大到小排列(冒泡法函数)
                for(k=0;k<i-j;k++)
                        if(arr[k]<arr[k+1])
                        {
                                t=arr[k];
                                arr[k]=arr[k+1];  
                                arr[k+1]=t;
                        }
}

//动态分配内存输入数据函数
int InputData(int **p)
{
        int count = 0;
        int memsize = ARRAY_SIZE;

        //初始分配10个int 
        int * arr = (int *)malloc(ARRAY_SIZE * sizeof(int));
        
        printf("循环一个数字,输入数字 0 结束输入!\n");

        while(arr != 0)
        {
                //输入一个数字
                scanf("%d",&arr[count]);
                
                //输入 0 结束循环
                if(arr[count++] == 0)
                {
                        break;
                }
                
                //当输入的数字个数等于已分配内存大小时,重新分配内存
                if(count >= memsize)
                {
                        memsize += ARRAY_SIZE;
                        arr = (int *)realloc(arr,memsize * sizeof(int));
                }
        }
        
        * p = arr;

        return count;
}

void main()
{
        int i,j,k,t,n,m,a[10],g;
        int left = 0;
        int right;
        int *p;

        printf("please enter any datas:\n");
        
        //动态分配的数组 p ,不需要a[10]了;
        i = InputData(&p);

/*
        for(i=0;;i++)
        {       
                p=(int *)calloc(i,sizeof(int));        //分配多个存储单元,每个字节单员的字节数
                scanf("%d",&a[i]);
                *p=a[i];
                p++;
        }
*/
        right=i;
        j=i;

        for(i=0;i<j;i++)
        {
                printf("%d ",p[i]);
                //printf("%d ",*p++);
        }

        printf("\n");
//        p-=i;
//        free(p);
        Rank(p,j);


        for(i=0;i<j;i++)
        {
                printf("%d ",p[i]);
        }
        printf("\n");

        scanf("%d", &n);                //输入任意数判断是否在数组内,如在则输出下标                                                  //函数部分
        //
        //g=Search(p,n,left,right);
        g=newSearch(p,n,right);
        if (-1==g)
        {
                printf("找不到\n");
        }
        else
        {
                printf("找到了,下标是:%d\n",g);
        }

        free(p);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 19:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表