2010-05-04 3 views
2

Также почему это дает мне ошибку, потому что я использовал bool?Проблема с алгоритмом последовательного поиска

Мне нужно использовать этот алгоритм последовательного поиска, но я не совсем уверен, как это сделать. Мне нужно использовать его с массивом. Может ли кто-нибудь указать мне в правильном направлении или что-то в том, как это использовать.

bool seqSearch (int list[], int last, int target, int* locn){ 
    int looker; 

    looker = 0; 
    while(looker < last && target != list[looker]){ 
        looker++; 
    } 

    *locn = looker; 
    return(target == list[looker]); 
} 
+0

Я знаю, Мне нужно передать массив и размер массива для последнего, но я не уверен, что положить в цель и int * locn – shinjuo

ответ

1

Похоже, вы бы использовать его как это ...

// I assume you've set an int list[], an int listlen and an int intToFind 

int where; 
bool found = seqSearch(list, listlen - 1, intToFind, &where); 
if (found) 
{ 
    // list[where] is the entry that was found; do something with it 
} 
1

Есть несколько вопросов.

  1. Я бы поменял имя последнего на размер.
  2. Если вы не нашли значение, вы разыщите неправильную ячейку памяти.

EDIT: Я думаю, последний - это length - 1. Это необычная подпись. Таким образом, звонок выглядит примерно так:

int list[CONSTANT]; 
... 
int foundIndex; 
bool found = seqSearch(list, sizeof(list)/sizeof(int), target, &foundIndex); 

Существует множество способов включить bool. Один из них - использовать stdbool.h с C99.

+0

Это прямо книги. Он сказал, что это может быть в финале, и я хочу убедиться, что я знаю, как его использовать. – shinjuo

+0

Я согласен с 2, но это довольно стандартный C, но ответственность за выделение хранилища для '* locn' - это вопрос вызывающего абонента – hhafez

+0

hhafez, я думаю, мы оба неправильно поняли. :) Я думал, что 'last' был длиной массива (это, по-видимому,' length - 1'), поэтому он выглядел как элемент после того, как массив можно было незаконно получить. Я не говорил о 'locn'. –

1

Это довольно ясно

list[] список вы ищете last является последним индексом в list target является то, что вы ищете в list locn будет содержать индекс, при котором target был найден возвращение значение является логическим, если указано target

для вашего вопроса, как передать locn, сделать что-то вроде

int locn; /* the locn where the index of target will be stored if found */ 

bool target_found = seqSearch(blah blah blah, &locn); 
+0

Но что я перехожу в locn? – shinjuo

+0

'int locn;/* locn, где индекс цели будет сохранен, если найден */ bool target_found = seqSearch (blah blah blah, &locn); ' – hhafez

1

Проблема с кодом, если вы ищете для элемента не присутствует в массиве, looker будет равен last и вы пытаетесь получить доступ к элементу массива на месте last, который является недействительным.

Вместо этого вы можете сделать:

bool seqSearch (int list[], int last, int target, int* locn) { 

    int looker; 

    for(looker=0;looker<last;looker++) { 

     // target found. 
     if(list[looker] == target) { 
      *locn = looker; // copy location. 
      return true; // return true. 
     } 
    } 

    // target not found. 
    *locn = -1; // copy an invalid location. 
    return false; // return false. 
} 

Вы вызываете функцию следующим образом:

int list[] = {5,4,3,2,1}; // the array to search in. 
int size = sizeof(list)/sizeof(list[0]); // number of elements in the array. 
int target = 3; // the key to search for. 
int locn; // to hold the location of the key found..and -1 if not found. 

if(seqSearch(list,size,target,&locn)) { 
    // target found in list at location locn. 
} else { 
    // target not found in list. 
} 
+0

Как вы знаете, что 'last' не находится в массиве? Вы можете передать length - 1 для 'last', а затем он функционирует просто отлично. Я думаю, что' last' здесь просто ссылается на то, что это последнее место, которое вы должны проверить (если вы хотите только проверить часть массива, например) Ответственность за предоставление правильной конечной точки приходится на вызывающего. – MBennett

+0

Я пробую это так, но это дает мне ошибку для использования bool. – shinjuo

+1

@shinjuo: вам нужно включить 'stdbool.h' вот рабочий пример: http://www.ideone.com/pWmTx – codaddict