Проблема с алгоритмом последовательного поиска - PullRequest
2 голосов
/ 04 мая 2010

Кроме того, почему это дает мне ошибку, потому что я использовал 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]);
}

Ответы [ 4 ]

1 голос
/ 04 мая 2010

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

// 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 голос
/ 04 мая 2010

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

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);
1 голос
/ 04 мая 2010

Проблема с вашим кодом в том, что если вы ищете элемент, отсутствующий в массиве, 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.
}
1 голос
/ 04 мая 2010

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

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

РЕДАКТИРОВАТЬ: я думаю, последний является length - 1. Это необычная подпись. Так что вызов что-то вроде:

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

Есть много способов включить bool. Один должен использовать stdbool.h с C99.

...