Помогите с реализацией бинарного поиска имен в массиве структур - PullRequest
1 голос
/ 15 апреля 2011

Мне нужно использовать бинарный поиск, чтобы найти запрошенное имя в массиве структур.Я использовал пример кода двоичного поиска, который искал ints и модифицировал его для поиска по индексу массива, чтобы сравнить имена в каждой структуре.Программа запускается, но имя так и не найдено, поэтому что-то определенно идет не так.Не уверен, что это так, как я беру имя из потока или просто мою реализацию поиска в целом.Может ли кто-нибудь взглянуть, предоставить некоторую обратную связь?спасибо

соответствующий код из функции ввода:

char entryName[31];
char discard;
string entryNameString;

cout << "What is the name of the entry you would like to look up?" << endl;
cin >> entryNameString;
cin.get(entryName, 30);
cin.get(discard);
findName(listLength, arrayOfStructs, entryName);

функция двоичного поиска:

void findName(int listLength, contactInfo* arrayOfStructs, const char* entryName)
{
    bool found = false;
    int low = 0, high = listLength-1, mid;

    while (!found && low <= high)
    {
        mid = (low + high) / 2;
        if (strcmp(entryName, arrayOfStructs[mid].contactName) == 0)
            found = true;
        else
           if (strcmp(entryName, arrayOfStructs[mid].contactName) < 0)
              high = mid - 1;
           else
              low = mid + 1;
    }

    if (found)
    {
        cout << arrayOfStructs[mid].contactName << endl;
        cout << arrayOfStructs[mid].birthday << endl;
        cout << arrayOfStructs[mid].addressInfo.streetName << endl;
        cout << arrayOfStructs[mid].addressInfo.cityName << endl;
        cout << arrayOfStructs[mid].addressInfo.state << " ";
        cout << arrayOfStructs[mid].addressInfo.zipcode << " ";
        cout << arrayOfStructs[mid].addressInfo.phoneNumber << endl;
        cout << arrayOfStructs[mid].typeOfentry << endl;
    }
    else
       cout << "NOT FOUND" << endl;
}

РЕДАКТИРОВАТЬ: arrayOfstructs []. contactName упорядочено в алфавитном порядке (например, .contactName = Amanda, находится в меньшем индексе, чем .contactName = Zorak)

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

Если вы пытаетесь ввести имена, разделенные пробелами, вам нужно использовать std::getline вместо istream::operator>>.

0 голосов
/ 15 апреля 2011

Так как вы также просили общий отзыв.Обратите внимание, что вы потенциально сравниваете одни и те же строки дважды для каждой итерации.strcmp возвращает значение меньше, равно или больше (-1,0,1).Вы можете получить возвращаемое значение и выполнить все дальнейшие сравнения с этим ...

int result = strcmp(entryName, arrayOfStructs[mid].contactName);
if (result == 0)            
   found = true;        
else           
  if (result < 0)              
    high = mid - 1;           
  else              
    low = mid + 1; 
...