17楼 sd01101230 (
一只蚂蚁)

回复于
2005-03-21 15:40:57 得分
5
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
char * key = "class3";
char *base[6] = {"class1","class3","class3","class2","class3","class3"};
unsigned int n = sizeof(base)/sizeof(base[0]),i=0;
char **result1;
int index[6]={0};
//preview data;
printf( "base before _lsearch:\n" );
for( i=0; i<n; ++i ) printf( "[ %s ]", base[i] );
printf( "\n\n" );
//search char
result1 = (char **)search( &key, base,&n,sizeof(base[0]),index, compare );
printf( "\n" );
//printf( " %d \n",sizeof(int) );
//print index & string +=sizeof(char*)
if (n != sizeof(base)/sizeof(base[0]) +10)
{
printf( "string index\n");
for( i=0; i<n;i ++)
printf ("%s %d \n",(char **)result1[i],index[i] );
}
getchar();
return 0;
}
int compare(const void * arg1,const void * arg2)
{
return (strcmp(*(char **)arg1,*(char **)arg2));
}
void * search(const void * key,
void * base,
unsigned int * num,
unsigned int width,
void * index,
int (_cdecl *compare)(const void *,const void *))
{
const char *pbase,*pelement;
const char *pback,*psearch;
int counter = -1,i = 0;
const int *indexback;
//DATA ssearch[6];
//base total adrress
try
{
pbase = (const char*) base + *num * width;
//save pre.Address
pback =psearch=pbase + *num * width;
indexback = (const int *)index;//=(int *)pback + *num * sizeof(int *);
//psearch -=width;
for ( pelement = (const char *)base; pelement < pbase; pelement +=width,i++)
{
if (!compare(key,(void *)pelement))
{
//index = &counter;
counter ++;
memcpy((void *)psearch,(void *)pelement,width);
memcpy((void *)indexback,(void *)(&i),sizeof(int *));
indexback ++ ;
psearch +=width;
//ssearch[counter].pdata = (char *)pback+width*counter;
//ssearch[counter].index = i;
}
}
if (counter !=-1)
{
//index = indexback;
*num = ++counter;
return ((void *) pback);
}
else
return (base);
}
catch (char *str)
{
MessageBox(NULL, str ,"",MB_OK);
}
//return 0;
}