2015-06-18 2 views
2

Предположим, что у меня есть массив struct, и каждый элемент имеет имя. Как:Поиск строки внутри массива char с использованием Divide и Conquer

struct something{ 
    char name[200]; 
}a[NMAX]; 

Учитывая новую строку (массив символов), мне нужно найти правильный индекс для его использования разделяй и властвуй. Как:

char choice[200]; 
cin>>chioce; 
int k=myFunction(choice); // will return the index, 0 otherwise 
          // of course, could be more parameters 
if(k) 
cout<<k; 

Я не знаю, как создать эту функцию испытующе (я пробовал, я знаю, как C работает D &, но я все еще учусь!).

И нет, я не хочу использовать строки!

Это то, что я пробовал:

int myFunction(char *choice, int l,int r) // starting with l==0 && r==n-1 
{ 
    int m; 
    if(strcmp(a[m].name,choice)==0) 
      return m; 
    else{ 
      m=(l+r)/2; 
      return myFunction(choice,l,m-1); 
      return myFunction(choice,m+1,r); 
    } 
} 
+2

И вы не используете 'std :: string', потому что ...? – user657267

+0

Помогите мне использовать символы, я еще не знаю строк. –

+0

Вы должны включить то, что вы пробовали, это поможет вам больше, если люди будут предлагать улучшения, найти ошибки, чем предоставить рабочий пример. –

ответ

2

Это мое решение для указанной задачи. Но я изменил несколько вещей в вашем коде.

#include<iostream> 
using namespace std; 

#define NMAX 10 

struct something{ 
    char *name; //replaced with char pointer so that i can save values the way i have done 
}a[NMAX]; 

int myFunction(char *choice, int l,int r) // starting with l==0 && r==NMAX-1 
{ 
    if(l>r) //return if l has become greater than r 
     return -1; 
    int m=(l+r)/2; 

    if(strcmp(a[m].name,choice)==0) 
      return m+1; 
    else if(l==r) //returned -1 as the value has not matched and further recursion is of no use 
       return -1; 
    else{ 

      int left= myFunction(choice,l,m-1);//replaced return 
      int right= myFunction(choice,m+1,r);//by saving values returned 
      if(left!=-1)      //so that i can check them, 
       return left;     //otherwise returning from here onlywould never allow second satatement to execute 
      if(right!=-1) 
       return right; 
      else 
       return -1; 
    } 
} 

int main(){ 

a[0].name="abc"; 
a[1].name="a"; 
a[2].name="abcd"; 
a[3].name="abcf"; 
a[4].name="abcg"; 
a[5].name="abch"; 
a[6].name="abcj"; 
a[7].name="abck"; 
a[8].name="abcl"; 
a[9].name="abcr"; 
char choice[200]; 
cin>>choice; 
int k=myFunction(choice,0,NMAX-1); // will return the index, 0 otherwise 
          // of course, could be more parameters 
if(k !=-1) 
cout<<k; 
else 
    cout<<"Not found"; 
return 0; 
} 

Надеюсь, это поможет.

Смежные вопросы