|
|
|
| через несколько минут назрел новый вопрос, никак не относящийся к экзамену. надо реализовать дек на основе двусвязных списков, добавелние слева справа, удаление справа слва. общий -то смысле понятен, не совсем понятен смысл работы с динамической памятью... | |
|
|
|
|
|
|
|
для: p3t01
(23.12.2007 в 04:52)
| | Дек свой реализовывать необходимо или можно воспользоваться готовым из стандартной библиотеки STL? | |
|
|
|
|
|
|
|
для: cheops
(23.12.2007 в 05:03)
| | надо реализовать свой... | |
|
|
|
|
|
|
|
для: 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;
} |
| |
|
|
|
|
|
|
|
для: cheops
(23.12.2007 в 06:43)
| | огромное спасибо. | |
|
|
|