Поиск значения в дереве
struct line{
int *next;
int *prev;
int value;
}line[40];
Я пишу функцию:
int line_search(int word) //На входе число, на выходе индекс структуры, содержащей это число
{
for(int n=0; n<40; n++)
{
if(line[n].value==word){
printf("V strytyre nomer %d naudeno sootvetstvie, n);
return n;
}
}
А вот как это реализовать через указатели (*next) я не помню. Подскажите plz. Буду очень благодарен.
Ребят, помогите plz. Дан массив структур. Реализовать алгоритм поиска через указатели. Например:
struct line{
int *next;
int *prev;
int value;
}line[40];
Я пишу функцию:
int line_search(int word) //На входе число, на выходе индекс структуры, содержащей это число
{
for(int n=0; n<40; n++)
{
if(line[n].value==word){
printf("V strytyre nomer %d naudeno sootvetstvie, n);
return n;
}
}
А вот как это реализовать через указатели (*next) я не помню. Подскажите plz. Буду очень благодарен.
Не совсем понял.
Может ты имеешь ввиду динамические списки?
Если да - тогда это будет выглядеть приблизительно вот так:
{
_line *next;
_line *prev;
int value;
} line[40];
Быстренько накидал функцию инициализации, но она может быть любая:
{
_line *last=NULL;
for (int i=0;i<40;i++)
{
line.prev=last;
last=line+i;
if (i<39) line.next=last+1;
else line.next=NULL;
line.value=i;
}
}
А это сама функция поиска:
{
int n=0;
_line *leaf=line;
while (leaf&&(leaf->value!=word))
{
leaf=leaf->next;
n++;
}
if (!leaf) n=-1; //число не найдено
else printf("V strytyre nomer %d naudeno sootvetstvie, n);
return n;
}
Такое изложение поможет?
Ну это не совсем то, что нужно. :) Грубо говоря, есть такое понятие, как перемещение по указателю (знак -> помоему, а мож я чет путаю). Вот как это реальизовать в алгоритме поиска?
Ну это не совсем то, что нужно. :) Грубо говоря, есть такое понятие, как перемещение по указателю (знак -> помоему, а мож я чет путаю). Вот как это реальизовать в алгоритме поиска?
Есть. Не совсем перемещение. Указатель, есть адрес памяти, связанный с конкретной областью (переменной). Доступ к указателю действительно осуществляется через оператор ->. Но я так и не понял до конца смысл задачи. Что в твоем примере означают поля *next и *prev?
Есть. Не совсем перемещение. Указатель, есть адрес памяти, связанный с конкретной областью (переменной). Доступ к указателю действительно осуществляется через оператор ->. Но я так и не понял до конца смысл задачи. Что в твоем примере означают поля *next и *prev?
Поле *next - указатель на последующую структуру. То есть, поиск должен происходить последовательно по каждой структуре. А переход между ними - посредством указателя *next.
Поле *next - указатель на последующую структуру. То есть, поиск должен происходить последовательно по каждой структуре. А переход между ними - посредством указателя *next.
Ну так я же тебе такой пример и привел.
Во первых, чтобы указатель next указывал на следующую структуру - он должен быть ТОГО же типа что и сама структура. Поэтому int *next в твоем случае категорически неправильно. Можно использовать конечно и int *next - но тогда тебе придется делать последующие типовые преобразования чтобы получить верный указатель на следующую структуру.
Во вторых указатели *next и *prev ОБЯЗАТЕЛЬНО должны быть заранее связаны с конкретными структурами в твоем массиве (см. initlist() - там как раз производится связывание).
В третьих, в контексте поставленой тобой задачи приведенная мной функция line_search и является ее решением. Хочешь - скомпилируй и проверь.
_line *next;
_line *prev;
int value;
};
_line* Search(_line*, int);
void main()
{
_line line[40];
...
int var = 5;//Для примера
_line* temp = Search(line, var);//Получаем адрес структуры где есть соответствие
}
//Возвращает NULL если соответствие не найдено
_line* Search(_line* l, int i)
{
while(l && l->value != i)
{
l = l->next;
}
return l;
}
И вот это вернет нето, что нужно, если структуры, упорядочены по указателям не так как по индексам)))))
{
int n=0;
_line *leaf=line;
while (leaf&&(leaf->value!=word))
{
leaf=leaf->next;
n++;
}
if (!leaf) n=-1; //число не найдено
else printf("V strytyre nomer %d naudeno sootvetstvie, n);
return n;
}