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函数传递的整数是负数的时候,或转成它的绝对值,运行结果如下:

posted @ 2014-02-07 02:28  I return back  阅读(401)  评论(0)    收藏  举报