Форум: Форум C++Разное
Новые темы: 00
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Дек
 
 автор: p3t01   (23.12.2007 в 04:52)   письмо автору
 
 

через несколько минут назрел новый вопрос, никак не относящийся к экзамену. надо реализовать дек на основе двусвязных списков, добавелние слева справа, удаление справа слва. общий -то смысле понятен, не совсем понятен смысл работы с динамической памятью...

  Ответить  
 
 автор: cheops   (23.12.2007 в 05:03)   письмо автору
 
   для: p3t01   (23.12.2007 в 04:52)
 

Дек свой реализовывать необходимо или можно воспользоваться готовым из стандартной библиотеки STL?

  Ответить  
 
 автор: p3t01   (23.12.2007 в 05:10)   письмо автору
 
   для: cheops   (23.12.2007 в 05:03)
 

надо реализовать свой...

  Ответить  
 
 автор: cheops   (23.12.2007 в 06:43)   письмо автору
 
   для: p3t01   (23.12.2007 в 04:52)
 

При построении двухсвязного списка можно отталкиваться от следующей конструкции
#include <iostream>
using namespace std;

typedef struct element
{
  int number;
  // Ссылка на следующий элемент списка
  struct element *next;
  // Ссылка на предыдущий элемент списка
  struct element *prev;
} element;

// Выделение памяти под элемент списка
element *create_element(int number);
// Добавление элемента справа от текущего
void add_next(element *current, element *new_element);
// Выводим содержимое списка
void print_list(element *list);
// Удаление всех элементов
void delete_list(element **list);
// Получение первого элемента списка
element *get_first(element *list);
// Выводим содержимое списка
void print_list(element *list);

int main()
{
  // Указатель на начало списка
  element *list = create_element(9);
  add_next(list, create_element(2));
  add_next(list, create_element(1));
  add_next(list, create_element(8));
  add_next(list, create_element(5));

  delete_list(&list);

  print_list(list);

  return 0;
}

// Удаление всех элементов
void delete_list(element **list)
{
  if(*list != NULL)
  {
    // Получаем первый элемент списка
    for(element *current = get_first(*list)->next;
        current != NULL;
        current = current->next)
    {
      delete current->prev;
    }
    *list = NULL;
  }
}
// Удаление элемента списка
void delete_element(element *element)
{
  if(element != NULL)
  {
    if(element->prev != NULL) element->prev->next = element->next;
    if(element->next != NULL) element->next->prev = element->prev;
    delete element;
  }
}

// Подсчет числа элементов списка
int get_count(element *list)
{
  int count = 0;
  element *prev = list;
  element *next = list;
  if(list != NULL)
  {
    ++count;
    while(prev->prev != NULL)
    {
      prev = prev->prev;
      ++count;
    }
    while(next->next != NULL)
    {
      next = next->next;
      ++count;
    }
  }
  return count;
}

// Выводим содержимое списка
void print_list(element *list)
{
  if(list != NULL)
  {
    // Получаем первый элемент списка
    for(element *current = get_first(list);
        current != NULL;
        current = current->next)
    {
      // Выводим содержимое cписка
      cout << current->number << "\n";
    }
  }
}

// Добавление элемента справа от текущего
void add_next(element *current, element *new_element)
{
  if(new_element != NULL && current != NULL)
  {
    new_element->next = current->next;
    new_element->prev = current;
    current->next = new_element;
    if(new_element->next != NULL) new_element->next->prev = new_element;
  }
}

// Выделение памяти под элемент списка
element *create_element(int number)
{
  element *item = new element;
  item->next = NULL;
  item->prev = NULL;
  item->number = number;
  return item;
}

// Получение первого элемента списка
element *get_first(element *list)
{
 if(list != NULL)
 {
   while(list->prev != NULL) list = list->prev;
 }
 return list;
}

// Получение последнего элемента списка
element *get_last(element *list)
{
 if(list != NULL)
 {
   while(list->next != NULL) list = list->next;
 }
 return list;
}

  Ответить  
 
 автор: p3t01   (23.12.2007 в 07:22)   письмо автору
 
   для: cheops   (23.12.2007 в 06:43)
 

огромное спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования