C语言- 二分查找法实现(综合应用)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <stdarg.h>
#define NOT_IN_MESSAGE "search %d not in %s\n "
#define IN_MESSAGE "search %d in %s, that Index of array eq %d\n "
#define ERROR -1
#define MAX_INT_DIGIT 10
int * getSizeTable();
int str2int(char*);
char * int2str(int);
int binsearch(int , int * ,int);
int * initArrays(int );
void printfArrays(char * message,int * ,int n);
int power(int, int);
int getLength(int *, int n);
main()
{
int n = 100;
int search = 45;
int *pInt = initArrays( n );
char buffer[getLength(pInt, n)];
printfArrays(buffer,pInt, n);
int status = binsearch(search, pInt, n);
if(status == -1)
{
printf(NOT_IN_MESSAGE, search, buffer);
}
else if(status >= 0 )
{
printf(IN_MESSAGE,search, buffer, status);
}
}
void nstrcat(char *dest, ...){
va_list ap;
char *p, *q;
va_start(ap, dest);
while( (p = va_arg(ap, char *)) != NULL ){
strcat(dest, p);
dest += strlen(p);
}
va_end(ap);
}
/*
* God Domn segmentation fault
*/
void printfArrays(char * buffer, int * v, int n)
{
if(v == NULL)
{
return ;
}
buffer[0] = '[';
int index;
for(index = 0 ; index <n ; index++)
{
int element = *(v+index);
char * s = int2str(element);
if(index < n -1)
{
nstrcat(buffer, s, ", ");
}
else
{
nstrcat(buffer, s, "]");
}
}
}
int binsearch(int x, int* pInt, int n)
{
int low, high, mid;
low = 0;
high = n -1;
while(low <= high)
{
mid = (low + high) / 2;
printf( "search = %d, low = %d, high = %d, mid = %d, v[%d] = %d\n", x, low, high, mid, mid, *(pInt+mid) );
if(x < *(pInt + mid))
{
high = mid - 1;
}
else if(x > *(pInt + mid))
{
low = mid + 1;
}
else if(x == *(pInt + mid))
{
return mid;
}
}
return -1;
}
int * initArrays( int n )
{
int * pInt = (int *) malloc (n * sizeof(int));
int index = 0 ;
for(; index < n ; index++)
{
*(pInt+index) = index + 1;
}
return pInt;
}
int getLength(int * v, int n)
{
int size = 2 ;
int index;
for(index = 0; index < n ; index++ )
{
int element = *(v+index);
char * s = int2str(element);
if(index < (n -1) )
{
size += strlen(s) + 2;
}else
{
size += strlen(s);
}
}
return size + n/2;
}
/**
* str2int
*/
int str2int( char* string)
{
int result = 0;
int size = (int)strlen(string);
int index = 0;
int base = 10;
int convert= 0;
int n = 0;
printf("%s size = %d\n", string ,size );
for(index = 0 ; index<= size -1 ; index++)
{
int c = string[index];
if(c < '0' || c > '9')
{
convert = ERROR;
break;
}
int n = power(10, size -1 - index);
if(n == ERROR)
{
convert = ERROR;
break;
}
n = n * (string[index] - 48);
/*
n = n * (string[index] - '0');
*/
convert += n;
printf("%c * pow(10, %d) = %d\n", string[index], (size - 1 - index), n );
}
result = convert;
return result;
}
int power(int base, int n)
{
int result = ERROR;
int m = 0 ;
if(base <= 0)
{
return result;
}
if(n < 0)
{
return result;
}
result = 1 ;
for(; m < n; m++)
{
result *= base;
}
return result;
}
char* int2str( int n)
{
int absn = abs(n);
int digit = getDigit(absn) + 1 ;
char *number = (char *) malloc (digit * sizeof(char));
int index = 0, difference = 0, realDigit = digit;
for(; index < digit ; index++ )
{
realDigit = realDigit - 1;
int iDigit = 0;
if(index == 0)
{
iDigit = (absn/ power(10, realDigit ));
difference = absn % (power(10, realDigit));
}
else
{
iDigit = (difference/ power(10, realDigit ));
difference = difference % (power(10, realDigit));
}
char c = {iDigit + '0'};
char cc[2];
cc[0] = c;
cc[1] = '\0';
number = strcat(number, cc);
}
return number;
}
int * getSizeTable()
{
int * sizeTable = sizeTable = (int *) malloc (MAX_INT_DIGIT * sizeof(int));
int index = 0, digit = 10, sum = 0;
for( ; index < MAX_INT_DIGIT - 1 ; index++ )
{
sum += power(digit, index) * 9;
*( sizeTable + index ) = sum;
}
*(sizeTable + MAX_INT_DIGIT -1 ) = INT_MAX;
return sizeTable;
}
int getDigit(int nInt)
{
int result = 0,min = 0, index = 0 ;
int * sizeTable = getSizeTable();
for(; index < MAX_INT_DIGIT; index++)
{
if(nInt <= *(sizeTable + index))
{
result = index;
break;
}
}
return result;
}
本示例存在缺陷:当int2str函数传递的整数是负数的时候,或转成它的绝对值,运行结果如下:


浙公网安备 33010602011771号