Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Перевести с DELPHI в С++ https://www.cyberforum.ru/ cpp-beginners/ thread318359.html
Кто-нибудь сможет помочь переписать код с delphi на с++? И вообще возможно ли это?
Нормальное Распределение чисел C++
есть программа. вычисляет нормально распределенные два числа методом Бокса — Мюллера, не могу сделать что выводила случайную последовательность а не два числа. помогите плиз! #include <math.h> typedef unsigned long long u64; typedef long long s64; typedef double d64; typedef struct { u64 rec_count; u64 start;
C++ Как изучать С++ ? Уважаемые участники форума, я тут на досуге - невзначай решил научиться азам С++. Нашел кучу учебников сижу типа читаю. Столкнулся с проблемой - масса ненужной информации и нет систематизации материала. Обычно начинают вешать всякую лапшу на уши о том как вначале ничего не было. потом создали компьютер, юзера, админа, Windows итд итп, а потом бац и сложный материал. Может ли мне кто... https://www.cyberforum.ru/ cpp-beginners/ thread318328.html C++ Нахождение кратчайшего пути в неорентированном графе от заданой вершины к заданной Добрый день. Вот решаю задачку о кратчайщем расстояние между двумя верщинами в неорентированном связном графе без циклов. Заданны такие параметры. (Помещаю их в файл text2.txt) 6 -- количество вершин N 1 2 7 -- Начало, конец, длина 2 3 3 2 4 6 4 5 3 5 6 1 4 -- количество пар вершин M для которых нужно узнать короткое растояние https://www.cyberforum.ru/ cpp-beginners/ thread318302.html
Массив C++
Помогите разобраться. Только начал читать про указатели и решил написать простенькую программку :) Она считает кол-во прописных букв и записывает эти буквы в массив. Насчет счетчика всё ясно, но вот как записывать буквы в массив не разобрался. GNU nano 2.2.6 Файл: p209E12.cpp #include <cctype> #include <iostream> using namespace std; main() {
C++ исправить код программы #include<iostream.h> #include<conio.h> #include<stdlib.h> #include<string.h> #include<iomanip.h> float f( float, float, float, float); float pr_chet( float *mas, int k); float sum_f( float *mas,int k); void Vivod_mas(float a,int k); https://www.cyberforum.ru/ cpp-beginners/ thread318270.html
C++ Дискриминант https://www.cyberforum.ru/ cpp-beginners/ thread318265.html
Даны числа A,B,C (Число А не равно нулю) Расмотрев дискриминант D=b^2-4*a*c проверить истинность высказывания ax^2+bx+c=0 имеет вещественные корни. Если можно попроще обьяснить я только начал всем спасибо заранее. пример А=2.68, В=0.93, с=-8.62 ---Истина
C++ HANDLE файла зная путь к нему
Привет всем. Подскажите с помощью какой функции можно получить HANDLE файла, при наличии полного пути к єтому фалу?
C++ шифрирование. Не могу сделать так чтобы при запуске программы сначало стоял выбор зашифровать текст или расшифровать. Помогите, курсовую сдать надо. #include <iostream.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <fstream.h> #include <math.h> https://www.cyberforum.ru/ cpp-beginners/ thread318258.html C++ напишите программу!!! тема "работа с символьными данными"!!! https://www.cyberforum.ru/ cpp-beginners/ thread318225.html
Прочитать из файла строку символов. Удалить в этой строке каждый символ * и повторить каждый символ, отличный от *. Новую строку не создавать. Вывести исходную и преобразованную строки.
C++ напишите программу! тема "динамическое распределение памяти"!
Таблица футбольного чемпионата, в котором участвуют n команд, задана своей верхней правой частью в виде последовательности чисел 0, 1 или 3 (число очков, набранных в игре: 3-выигрыш, 1-ничья, 0-проигрыш): первые n-1 чисел последовательности относятся к первой строке таблицы, следующие n-2 чисел - ко второй и т.д. Построить таблицу целиком, т.е. получить соответствующую квадратную матрицу порядка...
C++ Проблема с extern-переменными https://www.cyberforum.ru/ cpp-beginners/ thread318181.html
Такие дела. У меня два файла, func.cpp и main.cpp //func.cpp double sum, count; double average(double num) { sum += num; count++; return sum/count; }
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
12.06.2011, 21:22 0

Шаблон класса двусвязный список - C++ - Ответ 1753170

12.06.2011, 21:22. Показов 29670. Ответов 23
Метки (Все метки)

Ответ

Давайте попробую разжевать маленько.
Все на самом деле очень просто.
Значит так. Давайте сделаем так, что начало и конец списка хранит элемент класса List под названием base. base.next указывает на первый элемент списка, base.prev на последний. При этом количество кода на удаление и добавление элементов сокращается до одной строки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
 
// базовый класс элемента связного списка
// не содержит данных, содержит часть логики
struct NodeBase {
  NodeBase *prev; // указатель на предыдущий элемент связного списка
  NodeBase *next; // указатель на следующий элемент связного списка
  // при создании объекта класса конструктор по-умолчанию
  // назначает следующий и предыдущий элемент указывать на себя 
  NodeBase() : prev(this), next(this) {}
  // при создании с таким констуктором, элемент добавляет сам себя
  // в связный список, представляя себя предыдущему и следующему элементу
  NodeBase(NodeBase *prev_, NodeBase *next_)
    : prev(prev_), next(next_) { // назначаются предыдущий и следующий элементы
    // у предыдущего элемента следующим элементом назначается данный элемент
    // и у следующего элемента предыдущим элементом назначается данный элемент
    prev->next = next->prev = this;
  }
  // деструктор. при удалении элемента связного списка, 
  // элемент убирает сам себя из списка
  virtual ~NodeBase() {
    prev->next = next;
    next->prev = prev;
  }
};
 
// элемент связного списка, уже содержащий данные.
template <typename ValueType>
struct Node: public NodeBase{
  ValueType value; // то значение, которое хранит класс
  // конструктор подставляет значения и вызывает конструтор предка
  Node(NodeBase *prev_, NodeBase *next_, ValueType value)
    : NodeBase(prev_, next_), value(value) {}
};
 
// собственно, шаблон двусвязного списка
// смотрите, как мало собственно кода, если убрать комментарии
template <typename ValueType>
class List {
 public:
  // конструктору по-умолчанию делать в принципе нечего, он должен быть объявлен
  List() : base() {};
  // деструктор удаляет список функцией Clear
  ~List() {
    Clear();
  }
  // функция проверяет, пустой ли список
  bool Empty() {
    // список пустой, если базовый элемент указывает сам на себя
    return ((base.next == &base) && (base.prev == &base));
  }
  void Clear() {
    // пока список не пуст
    while (!Empty())
      // удаляется первый элемент
      // работу по удалению из списка сделает деструктор класса элемента
      delete base.next;
  }
  // добавление элемента в конец списка
  void PushBack(const ValueType &value) {
    // просто создается новый элемент списка,
    // всё остальное сделает конструктор класса NodeBase
    new Node<ValueType>(base.prev, &base, value);
  }
  // удаление последнего элемента
  void PopBack() {
    // удаляется элемент связного списка 
    // (в данном случае последний, но в принципе, сработает с любым)
    // работу по фактическому удалению элемента из списка выполнит деструктор
    // класса NodeBase
    delete base.prev;
  }
  // плохой стиль, лучше делать через итераторы, но эта концепция, наверно,
  // слишком сложна
  void PrintAll() {
    // перебор всех элементов в одном цикле
    for (NodeBase *node = base.next; node != &base; node = node->next)
      // для получения значения элемент списка приводится к типу Node*
      std::cout << static_cast< Node<ValueType>* >(node)->value;
  }
 private:
  // базовый эелемент.
  // его поле next указывает на первый элемент списка
  // поле prev указываеты на последний элемент списка
  // если список пуст, next == prev == &base
  NodeBase base;
};
 
// класс автобуса
struct Bus {
  int number;
  int route;
  //... тут наверно нужны другие поля
  Bus(int number_, int route_) : number(number_), route(route_) {}
  // переопределенный оператор для вывода на экран
  friend std::ostream& operator<<(std::ostream &stream, const Bus &bus) {
    return stream << "Bus number " << bus.number
                  << ", route: " << bus.route
                  << std::endl;
  }
};
 
int main(int argc, char *argv[]) {
  List<Bus> a; // список автобусов
  // добавим в список сто автобусов
  for (int i = 0; i < 100; ++i)
    a.PushBack(Bus(i + 1, i));
  // вывод его на экран
  a.PrintAll();
}


Вернуться к обсуждению:
Шаблон класса двусвязный список C++
2
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2011, 21:22
Готовые ответы и решения:

Шаблон класса двусвязный список
Доброго времени суток! Препод дал задание реализовать шаблон класса двусвязный список. Сам класс...

Кольцевой двусвязный список шаблон класса ошибки
Код выдаёт некоторые ошибки (прикрепили, на картинке): Что исправить? #include &quot;StdAfx.h&quot; ...

Составить двусвязный список на основе класса, объекты которого будут формировать этот список
Составить двусвязный список на основе класса, объекты которого будут формировать этот список. В...

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают)...

23
12.06.2011, 21:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2011, 21:22
Помогаю со студенческими работами здесь

Реализация класса «двусвязный список»
потребовалось выполнить такое задание, вот только не могу сообразить с чего начать и как собственно...

Реализация класса множество через двусвязный список.
дали задание реализовать класс множество через двусвязный список. Сам класс список мне...

Реализовать классы «стек» и «очередь» наследованием от базового класса «двусвязный список»
Всем добрый вечер! Помогите пожалуйста с лабораторной работой, дело в том что скоро сдавать, а я в...

Реализовать классы «стек» и «очередь» наследованием от базового класса «двусвязный список»
Реализовать классы «стек» и «очередь» наследованием от базового класса «двусвязный список». Создать...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru