Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: cheops   (23.12.2007 в 06:43)
При построении двухсвязного списка можно отталкиваться от следующей конструкции
#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;
}


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: