juedian 发表于 2020-10-30 21:27:13

数组的动态存储,排序,查找

求教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>key)//将想要找的数与中间数作比较
{
        right = mid-1;//改变下标;下同
}
                else if (arr <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<arr)
                        {
                                t=arr;
                                arr=arr;
                                arr=t;
                        }
                        for(j=0;j<9;j++)
                        {
                                printf("%d ",arr);
                        }
}

void main()
{
        int i,j,k,t,n,m,a,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);
                *p=a;
                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);
        }
        scanf("%d", &n);                //输入任意数判断是否在数组内,如在则输出下标                                                //函数部分
   g=Search(a,n,left,right);
        {

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




xieglt 发表于 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)
        {
                return &arr;
        }

        if(key > arr)
        {
          return SearchData(arr,key,mid);
        }
        else
        {
                return SearchData(&arr,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>key)//将想要找的数与中间数作比较
                {
                        right = mid-1;//改变下标;下同
                }
                else if (arr <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<arr)
                        {
                                t=arr;
                                arr=arr;
                                arr=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);
               
                //输入 0 结束循环
                if(arr == 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,g;
        int left = 0;
        int right;
        int *p;

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

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

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

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


        for(i=0;i<j;i++)
        {
                printf("%d ",p);
        }
        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);
}
页: [1]
查看完整版本: 数组的动态存储,排序,查找