Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсивные структуры, Зачем они нужны? 
:(
    Опции темы
gepard
Дата 7.6.2004, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Зачем нужны рекурсивные структуры?
Вот, например есть у меня рекурсивная стурктура:
Код

#include <stdio.h>
struct ss
{
char* chr;
float f;
int i;
struct ss* _s;
};
void main()
{
struct ss s1;
}

Ведь теперь я могу написать что-то вроде этого: s1._s->_s->_s->_s->..., где ... - всё тоже _s-> повторяемое любое кол-во раз.
Не злитесь, если вопрос глупый, я просто ещё не все основы понять могу.


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
boevik
Дата 7.6.2004, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: нет
Всего: 35



Вопрос касается структур данных.
Эта структура называется List. Обычно его сравливают с массивом
Достоинства листа по сравнению с массивом:
1) Вставка и удаление происходит элемента происходит за О(1)
2) Неограничен максимальный размер (всегда можно добавить доп.элемент, в отличии от массива)
Недостаток:
1) поиск элемента i занимает O(n)
2) в твоем случае, двигаться по листу можно только от начало в конец. (Проблему можно решить двух сторонним листом)

Это основные моменты.






--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
bilbobagginz
Дата 7.6.2004, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



эта структура - не рекурсивная (потому, что в рекурсии выход нужен smile.gif )

то что ты описал это элементарная структура данных, основа многого, называется
"one way linked list", (не знаю как по-русски, сорри)

самый первый указатель сохраняют и называют "голова"
можно сохранить и последний и назвать "хвост"
так можно использовать для хранения данных:

Код

#include <stdio.h> /* i/o */
#include <stdlib.h>  /* malloc/free */

#define NAME_LEN 256

struct ss{
   char* imja;
   float srednyj bal;
   int porjadkovyj_nomer;
   struct ss* next;
};
typedef struct ss list_node;
typedef struct ss* plist_node;

struct one_way_list{
   plist_node head;
   plist_node tail;
   int len;
};

typedef struct one_way_list student_list;
typedef struct one_way_list* pstudent_list;


pstudent_list InitList();v /* пишешь ф. для создания. */
void destroy_list(pstudent_list sl); /*освободить память */
int insert_next(pstudent_list sl, char* name_, float avg_, int num_); /* пишешь ф. для добавления */
int delete_last(pstudent_list sl); /* стирание последнего */
plist_node find_in_list(pstudent_list sl, char* name__); /* найти студента в классе */
void print_node(plist_node n); /* распечатать инфу о студенте */
void print_list(pstudent_list sl); /* распечатать класс */


int main(){
   list_node TmpStudent; /*временная запись  */
   float avg=0;                 /* временный ср. балл */
   int num=-1;                  /* временный номер */
    int i=0;                         /* индекс */  
    int x=0;
     char c;
   int test =0;                     /* тестовый результат  */
   char name_curr[NAME_LEN];
   pstudent_list SL=InitList();
   if (!SL) {
        printf("памяти нет, звоните позже!\n");
         exit(-1);
   }
   else{
      printf("Удачно создали классную запись\n");
   }
    printf("Добавим студентов (не больше 20-и)!\n");
    for (i=0; i< 20; i++){
          printf("Имя:");
           
          for (x=0;(('\n'!=(c=getchar()))&&(x<MAX_LEN));x++)
                   name_curr[x]=c;
           printf("номер:"); scanf("%d", &num);
            printf("средний балл:"); scanf("%f",&avg);
           test=insert_next(SL, name, avg, num);
            if (!test) {
                  printf("Добавлен ещё студент\n");
            }
            else{
                  printf("Не Добавлен студент!\n");
            }
             for (x=0;x<MAX_LEN;x++) name_curr[x]='\0'; /*почистим  */
      }
       
       
      print_list(SL); /* печатаем весь класс */
      destroy_list(SL); /*стираем все записи */
      exit(0);

}


/* реализация некоторых: */

static void destroy_node(plist_node ln){
      if (!ln) return;
      if (ln->next) destroy_node(ln->next);
      free(ln);
      return;
}

void destroy_list(pstudent_list sl){
       if (!sl) return;
       if (sl->head) destroy_node(sl->head);
       free(sl);
       return;
}





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
bel_nikita
Дата 7.6.2004, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Зачем нужны рекурсивные структуры?
Для построения связных списков.
Связный список - это динамическое множество, элементы которого линейно упорядочены, но порядок определяется не номерами, а указателями, входящими в состав списка.
Проще говоря, это некоторая структура, определенная пользователем, одним из полей которой будет указатель на экземпляр такой же структуры. Обработка информации содержащейся в списке сводится к тому, что бы пройти по всему списку, используя указатель, как связующее звено между элементами. Последнему элементу(обычно называют Tail) связного списка в поле указателя на следующий экземпляр структуры, присваивается пустой указатель NULL.
Вот тута про структуры данных: http://alglib.manual.ru/articles/struct.php

to bilbobagginz
А я бы использовал std::list smile.gif Намного проще, и отлаживать не надо

Это сообщение отредактировал(а) bel_nikita - 7.6.2004, 10:29


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
boevik
Дата 7.6.2004, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: нет
Всего: 35



Цитата
Последнему элементу(обычно называют Tail) связного списка в поле указателя на следующий экземпляр структуры, присваивается пустой указатель NULL.

Или последний элемент может указывать на первый, тогда получается Circularly Linked List.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
gepard
Дата 7.6.2004, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Спасибо, уважаемые, всем спасибо.


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Baa
Дата 7.6.2004, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



Боевик, это по-русски зовется односвязный список.


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
boevik
Дата 7.6.2004, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: нет
Всего: 35



Baa , спасибо.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
cardinal
Дата 7.6.2004, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата
потому, что в рекурсии выход нужен

Зачем? Просто будет бесконеная рекурсия... smile.gif И как насчет того же
Цитата
Или последний элемент может указывать на первый, тогда получается Circularly Linked List.



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
mr.DUDA
Дата 7.6.2004, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



З.Ы, с пом. таких "рекурсивных структур" можно организовывать не только списки, но и деревья (пример - сбалансированное двоичное дерево, где в каждом элементе хранится указатель на "красный" и "чёрный" соседние элементы).



--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.