Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск значения в дереве

2.1K
21 марта 2006 года
AD_min
36 / / 11.02.2004
Ребят, помогите 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. Буду очень благодарен.
15K
21 марта 2006 года
Red Alert
15 / / 19.03.2006
Цитата:
Originally posted by AD_min
Ребят, помогите 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. Буду очень благодарен.



Не совсем понял.
Может ты имеешь ввиду динамические списки?
Если да - тогда это будет выглядеть приблизительно вот так:

 
Код:
struct _line
{
  _line *next;
  _line *prev;
  int value;
} line[40];


Быстренько накидал функцию инициализации, но она может быть любая:

Код:
void initlist()
{
   _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 line_search(int word)
{
   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;
}


Такое изложение поможет?
2.1K
21 марта 2006 года
AD_min
36 / / 11.02.2004
Цитата:
Такое изложение поможет?


Ну это не совсем то, что нужно. :) Грубо говоря, есть такое понятие, как перемещение по указателю (знак -> помоему, а мож я чет путаю). Вот как это реальизовать в алгоритме поиска?

15K
21 марта 2006 года
Red Alert
15 / / 19.03.2006
Цитата:
Originally posted by AD_min
Ну это не совсем то, что нужно. :) Грубо говоря, есть такое понятие, как перемещение по указателю (знак -> помоему, а мож я чет путаю). Вот как это реальизовать в алгоритме поиска?



Есть. Не совсем перемещение. Указатель, есть адрес памяти, связанный с конкретной областью (переменной). Доступ к указателю действительно осуществляется через оператор ->. Но я так и не понял до конца смысл задачи. Что в твоем примере означают поля *next и *prev?

2.1K
21 марта 2006 года
AD_min
36 / / 11.02.2004
Цитата:
Originally posted by Red Alert
Есть. Не совсем перемещение. Указатель, есть адрес памяти, связанный с конкретной областью (переменной). Доступ к указателю действительно осуществляется через оператор ->. Но я так и не понял до конца смысл задачи. Что в твоем примере означают поля *next и *prev?


Поле *next - указатель на последующую структуру. То есть, поиск должен происходить последовательно по каждой структуре. А переход между ними - посредством указателя *next.

15K
21 марта 2006 года
Red Alert
15 / / 19.03.2006
Цитата:
Originally posted by AD_min
Поле *next - указатель на последующую структуру. То есть, поиск должен происходить последовательно по каждой структуре. А переход между ними - посредством указателя *next.



Ну так я же тебе такой пример и привел.
Во первых, чтобы указатель next указывал на следующую структуру - он должен быть ТОГО же типа что и сама структура. Поэтому int *next в твоем случае категорически неправильно. Можно использовать конечно и int *next - но тогда тебе придется делать последующие типовые преобразования чтобы получить верный указатель на следующую структуру.
Во вторых указатели *next и *prev ОБЯЗАТЕЛЬНО должны быть заранее связаны с конкретными структурами в твоем массиве (см. initlist() - там как раз производится связывание).
В третьих, в контексте поставленой тобой задачи приведенная мной функция line_search и является ее решением. Хочешь - скомпилируй и проверь.

14K
21 марта 2006 года
halflifer
28 / / 14.03.2006
То же самое только немного перефразированно)

Код:
struct _line{
_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 line_search(int word)
{
   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;
}
2.1K
22 марта 2006 года
AD_min
36 / / 11.02.2004
спасибо :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог