|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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);
}
}
}
- #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);
- }
复制代码
|
|