鱼C论坛

 找回密码
 立即注册
查看: 1183|回复: 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
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. #define ARRAY_SIZE        (10)

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

  8.         if(i <= 0)
  9.         {
  10.                 return 0;
  11.         }
  12.        
  13.         if(key == arr[mid])
  14.         {
  15.                 return &arr[mid];
  16.         }

  17.         if(key > arr[mid])
  18.         {
  19.             return SearchData(arr,key,mid);
  20.         }
  21.         else
  22.         {
  23.                 return SearchData(&arr[mid+1],key,mid-1);
  24.         }
  25. }

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

  29.         if(p == 0)
  30.         {
  31.                 return -1;
  32.         }
  33.         else
  34.         {
  35.                 return p - arr;
  36.         }
  37. }


  38. //你这个查找函数有问题,总是找不到,没有给你改了,写了一个新的查找
  39. int Search(int arr[], int key,int left,int right)                                                //二分法的函数部分;
  40. {                                                                                                        //将要找的数字与中间的数字进行比较,比较后将下标移动
  41.         while (left <= right)                                                                        //比较部分是数字,改变部分是下标
  42.         {
  43.                 int mid =left + (right-left) / 2;//中间下标的计算
  44.                 if (arr[mid]>key)//将想要找的数与中间数作比较
  45.                 {
  46.                         right = mid-1;//改变下标;下同
  47.                 }
  48.                 else if (arr[mid] <key)
  49.                 {
  50.                         left = mid+1;
  51.                 }
  52.                 else
  53.                 {
  54.                         return mid;//判断完后将中间下标对应的数字筛选出来
  55.                 }
  56.         }
  57.         return -1;
  58. }

  59. void Rank(int arr[],int i)
  60. {
  61.         int j,k,t;

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

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

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

  80.         while(arr != 0)
  81.         {
  82.                 //输入一个数字
  83.                 scanf("%d",&arr[count]);
  84.                
  85.                 //输入 0 结束循环
  86.                 if(arr[count++] == 0)
  87.                 {
  88.                         break;
  89.                 }
  90.                
  91.                 //当输入的数字个数等于已分配内存大小时,重新分配内存
  92.                 if(count >= memsize)
  93.                 {
  94.                         memsize += ARRAY_SIZE;
  95.                         arr = (int *)realloc(arr,memsize * sizeof(int));
  96.                 }
  97.         }
  98.        
  99.         * p = arr;

  100.         return count;
  101. }

  102. void main()
  103. {
  104.         int i,j,k,t,n,m,a[10],g;
  105.         int left = 0;
  106.         int right;
  107.         int *p;

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

  112. /*
  113.         for(i=0;;i++)
  114.         {      
  115.                 p=(int *)calloc(i,sizeof(int));        //分配多个存储单元,每个字节单员的字节数
  116.                 scanf("%d",&a[i]);
  117.                 *p=a[i];
  118.                 p++;
  119.         }
  120. */
  121.         right=i;
  122.         j=i;

  123.         for(i=0;i<j;i++)
  124.         {
  125.                 printf("%d ",p[i]);
  126.                 //printf("%d ",*p++);
  127.         }

  128.         printf("\n");
  129. //        p-=i;
  130. //        free(p);
  131.         Rank(p,j);


  132.         for(i=0;i<j;i++)
  133.         {
  134.                 printf("%d ",p[i]);
  135.         }
  136.         printf("\n");

  137.         scanf("%d", &n);                //输入任意数判断是否在数组内,如在则输出下标                                                  //函数部分
  138.         //
  139.         //g=Search(p,n,left,right);
  140.         g=newSearch(p,n,right);
  141.         if (-1==g)
  142.         {
  143.                 printf("找不到\n");
  144.         }
  145.         else
  146.         {
  147.                 printf("找到了,下标是:%d\n",g);
  148.         }

  149.         free(p);
  150. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  3. #define ARRAY_SIZE        (10)

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

  8.         if(i <= 0)
  9.         {
  10.                 return 0;
  11.         }
  12.        
  13.         if(key == arr[mid])
  14.         {
  15.                 return &arr[mid];
  16.         }

  17.         if(key > arr[mid])
  18.         {
  19.             return SearchData(arr,key,mid);
  20.         }
  21.         else
  22.         {
  23.                 return SearchData(&arr[mid+1],key,mid-1);
  24.         }
  25. }

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

  29.         if(p == 0)
  30.         {
  31.                 return -1;
  32.         }
  33.         else
  34.         {
  35.                 return p - arr;
  36.         }
  37. }


  38. //你这个查找函数有问题,总是找不到,没有给你改了,写了一个新的查找
  39. int Search(int arr[], int key,int left,int right)                                                //二分法的函数部分;
  40. {                                                                                                        //将要找的数字与中间的数字进行比较,比较后将下标移动
  41.         while (left <= right)                                                                        //比较部分是数字,改变部分是下标
  42.         {
  43.                 int mid =left + (right-left) / 2;//中间下标的计算
  44.                 if (arr[mid]>key)//将想要找的数与中间数作比较
  45.                 {
  46.                         right = mid-1;//改变下标;下同
  47.                 }
  48.                 else if (arr[mid] <key)
  49.                 {
  50.                         left = mid+1;
  51.                 }
  52.                 else
  53.                 {
  54.                         return mid;//判断完后将中间下标对应的数字筛选出来
  55.                 }
  56.         }
  57.         return -1;
  58. }

  59. void Rank(int arr[],int i)
  60. {
  61.         int j,k,t;

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

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

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

  80.         while(arr != 0)
  81.         {
  82.                 //输入一个数字
  83.                 scanf("%d",&arr[count]);
  84.                
  85.                 //输入 0 结束循环
  86.                 if(arr[count++] == 0)
  87.                 {
  88.                         break;
  89.                 }
  90.                
  91.                 //当输入的数字个数等于已分配内存大小时,重新分配内存
  92.                 if(count >= memsize)
  93.                 {
  94.                         memsize += ARRAY_SIZE;
  95.                         arr = (int *)realloc(arr,memsize * sizeof(int));
  96.                 }
  97.         }
  98.        
  99.         * p = arr;

  100.         return count;
  101. }

  102. void main()
  103. {
  104.         int i,j,k,t,n,m,a[10],g;
  105.         int left = 0;
  106.         int right;
  107.         int *p;

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

  112. /*
  113.         for(i=0;;i++)
  114.         {      
  115.                 p=(int *)calloc(i,sizeof(int));        //分配多个存储单元,每个字节单员的字节数
  116.                 scanf("%d",&a[i]);
  117.                 *p=a[i];
  118.                 p++;
  119.         }
  120. */
  121.         right=i;
  122.         j=i;

  123.         for(i=0;i<j;i++)
  124.         {
  125.                 printf("%d ",p[i]);
  126.                 //printf("%d ",*p++);
  127.         }

  128.         printf("\n");
  129. //        p-=i;
  130. //        free(p);
  131.         Rank(p,j);


  132.         for(i=0;i<j;i++)
  133.         {
  134.                 printf("%d ",p[i]);
  135.         }
  136.         printf("\n");

  137.         scanf("%d", &n);                //输入任意数判断是否在数组内,如在则输出下标                                                  //函数部分
  138.         //
  139.         //g=Search(p,n,left,right);
  140.         g=newSearch(p,n,right);
  141.         if (-1==g)
  142.         {
  143.                 printf("找不到\n");
  144.         }
  145.         else
  146.         {
  147.                 printf("找到了,下标是:%d\n",g);
  148.         }

  149.         free(p);
  150. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 09:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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