数组的动态存储,排序,查找
求教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);
}
}
}
#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]