Форум программистов, компьютерный форум CyberForum.ru

Дек символов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Ded_Vasilij
 Аватар для Ded_Vasilij
229 / 211 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
15.02.2013, 20:23     Дек символов #1
Доброго времени суток всем.
У меня такая проблема: есть задача -
Реализовать класс "Дек символов" (на базе списка).

Реализовать класс "Массив деков". Длина массива определяется во время
инициализации и в дальнейшем не меняется. Массив должен хранить сами деки,
а не указатели на них. Доступ к элементам массива осуществляется с помощью
квадратных скобок.
Начал делать, но поскольку с классами работаю впервые, то не совсем разобрался как это делать.
вот моя реализация:
файл L2.h
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
#pragma once
class L2_elem
{
    char el;
    L2_elem* next;
    L2_elem* prev;
public:
    L2_elem();                                      //занулить указатели
    L2_elem (char c, L2_elem* n,L2_elem* p);        //пприсваивание значений
    char get_el();
    L2_elem* get_n();
    L2_elem* get_p();
};
class L2
{
    L2_elem* head;
    
public:
    L2();                               // инициализация
    ~L2();                              // деструктор
    L2(const L2 &List);                 // копирование
    L2& operator = (const L2& List);    // оператор перегрузки
    char get_el (int i);                // получить элемент
    void put (char el);                 // добавить элемент
    void del();                         // удалить элемент
    void print (L2 List);               // печать
    int size (L2 List);                 // размер списка
};
файл L2.cpp
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
#include <iostream>
#include "L2.h"
L2_elem :: L2_elem()
{
    L2_elem.next = 0;// error C2143: синтаксическая ошибка: отсутствие ";" перед "."
 
    L2_elem.prev = 0;
}
char L2_elem :: get_el()
{
    return el;
}
 
L2_elem*  L2_elem :: get_n()
{
    return L2_elem.next ;
}
 
 
 
L2 :: L2()
{
    head = new L2_elem;                             // по умолчанию вызывается конструктор без параметров L2_elem
}
Я понимаю, что я сделал чего-то не так, но пока не могу понять чего, ошибка мелкая, из=за нее вся работа встала. Подскажите пожалуйста чего я не так делаю
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2013, 20:23     Дек символов
Посмотрите здесь:

C++ Вектор, дек, список
Полный дек C++
дек C++
дек через список C++
Очередь и дек С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
23.02.2013, 19:57     Дек символов #21
Ошибка №1. Если в цикле ты сделал переход head = head->next и он стал равен 0, то что удалится при вызове delete head->prev?
Цитата Сообщение от Ded_Vasilij Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
void L2 :: makeEmpty()
{
    while (head !=0)
    {
        head = head->next; 
        delete head->prev;
    }
    head->next = 0;
}
Ошибка №2.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
строка 43.
уже сам head равен NULL
Ошибка №3 (логическая)
Цитата Сообщение от Ded_Vasilij Посмотреть сообщение
C++
1
2
3
4
5
6
L2 :: L2 (const L2 &List)
{
...
        pushHead(c);
....
}
ты скопируешь список задом наперед. Надо pushTail
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ded_Vasilij
 Аватар для Ded_Vasilij
229 / 211 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
23.02.2013, 21:23  [ТС]     Дек символов #22
Как обычно по мелочи затупил. Внимательнее надо быть.
вот рабочая makeEmpty()

C++
1
2
3
4
5
6
7
8
9
10
11
void L2 :: makeEmpty()
{   
    L2_elem* p = 0;
    while (head !=0)
    {
        p = head;
        head = head->next;          
        delete p;
    }
    head = 0;
}
А по поводу оператора присваивания - по моему надо сперва очистить второй список с помощью makeEmpty, а затем просто скопировать с помощью конструктора копирования.
И все будет в шоколаде. По моему так
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
23.02.2013, 22:02     Дек символов #23
про оператор присваивания я уже писал раньше. вначале очищаешь список, а потом добавляешь в него элементы из другого списка с помощью pushTail

Добавлено через 12 минут
ты не сможешь вызвать конструктор копии как функцию
Ded_Vasilij
 Аватар для Ded_Vasilij
229 / 211 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
07.03.2013, 18:27  [ТС]     Дек символов #24
вроде бы написал L2, со всеми необходимыми методами, осталось только вставку и удаление элемента после заданного добавить.
Подскажите пожалуйста, что можно оптимизировать в коде, и с какого бока подступиться к деку, точнее говоря, насколько я понял, у дека будут те же методы, что и у L2, но как это правильно организовать?
Вложения
Тип файла: rar task 3.rar (4.0 Кб, 5 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2013, 18:43     Дек символов
Еще ссылки по теме:

C++ Простой дек
C++ Дек в виде массива
C++ Дек-шаблон

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ded_Vasilij
 Аватар для Ded_Vasilij
229 / 211 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
07.03.2013, 18:43  [ТС]     Дек символов #25
при написании функции
C++
1
AddAfter(int i, char c){}
возникла проблема: мне нужно определить, не вылетает ли i за границы списка, но я не могу получить доступ к функции size(), this.size() тоже ошибку пишет. Подскажите, как обмануть судьбу пожалуйста.
Yandex
Объявления
07.03.2013, 18:43     Дек символов
Ответ Создать тему
Опции темы

Текущее время: 17:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru