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

Удалить первый элемент из списка - C++

Восстановить пароль Регистрация
 
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
27.05.2012, 22:49     Удалить первый элемент из списка #1
Всем хай!
Есть задача, создать список и выполнить некие операции надо ним
и так список:
C++
1
2
3
4
5
struct element
{
     char a;
     element *next;
};
так же есть класс в котором перегрузил унарный оператор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
list list::operator--()
{
     if (head)
     {
        element *h;
        h = head;
        head = h->next;
        delete h;
        kol--; // тип int 
     }
     else std::cout<<"List is empty 6666\n";
     return (*this);
}
который как раз и должен удалить первый элемент но что то при удалении в результате не то что надо остается... Подскажите где накосячил
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.05.2012, 22:53     Удалить первый элемент из списка #2
Чистый, выложи полный код. Здесь вроде всё как надо (кроме момента возврата из оператора списка по значению, да и идеологически неверной перегрузки оператора с подобной целью).
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
27.05.2012, 23:03  [ТС]     Удалить первый элемент из списка #3
вот код:
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
#include <iostream>
 
using namespace std;
 
struct element
{
     char a;
     element *next;
};
class list
{
    element *head;
    int kol;
 
public:
    list();
    explicit list(char c);
    bool operator == (list &l);
    list operator--();
    void add(char c);
    void print();
 
    ~list();
 
};
 
int main()
{
    list ch1('a'), ch2('a');
    if (ch1==ch2)
    {
        cout << "Элементы одинаковые\n";
    }
    else
    {
        cout << "Элементы разные\n";
    }
    cout << "Первый экземпляр элемента ";
    ch1.print();
    cout << "\nВторой экземпляр элемента ";
    ch2.print();
    cout << "\nAdd data in class\n" << endl;
    ch1.add('g');
    if (ch1==ch2)
    {
        cout << "Элементы одинаковые\n";
    }
    else
    {
        cout << "Элементы разные\n";
    }
    cout << "Первый экземпляр элемента ";
    ch1.print();
    cout << "\nВторой экземпляр элемента ";
    ch2.print();
    --ch1;
    cout << "Первый экземпляр элемента ";
    ch1.print();
    return 0;
}
и расскажи что не так сделал... Все же я пока учусь и хочу на этом этапе понять что не так что бы потом не пришлось переучиваться
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.05.2012, 23:05     Удалить первый элемент из списка #4
Чистый, а реализация списка?
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
27.05.2012, 23:10  [ТС]     Удалить первый элемент из списка #5
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
list::list()
{
    head = NULL;
    kol = 0;
}
 
list::list(char c)
{
    head = new element;
    head->a = c;
    head->next = NULL;
    kol = 1;
}
 
list::~list()
{
    element *h;
    if (head)
    {
        do
        {
            h = head;
            head = h->next;
            delete h;
        }
        while (head);
    }
}
 
void list::add(char c)
{
     if (head == NULL)
     {
        head = new element;
        head->a = c;
        head->next = NULL;
        kol = 1;
     }
     else
     {
        element *h;
        h = new element;
        h->a = c;
        h->next = head;
        head = h;
        kol++;
     }
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.05.2012, 23:15     Удалить первый элемент из списка #6
Чистый, ну, собственно, для начала. Не реализован конструктор копии. Значит, что используется предоставляемый компилятором, выполняющий обычное поэлементное копирование. Что происходит при вызове lis::operator--(), а вернее, при возврате из него: поскольку возврат осуществляется по значению, вызывается конструктор копии. Поскольку он не реализован, вызывается стандартный. Поскольку вызывается стандартный, то ни о каком копировании самого списка речи не идёт, копируются только указатели. А поскольку оператор декремента вызывается без приёмника, то возвращённый из него объект тут же и удаляется, т.е. вызывается деструктор. А поскольку оставшийся объект хранил те же адреса, что и временный, возвращённый из оператора --, то и уничтожается реальный список, который присутствует в единственном экземпляре. Рассуждать о том, что происходит дальше, гиблое дело, тут всё на воле случая.
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
27.05.2012, 23:25  [ТС]     Удалить первый элемент из списка #7
так как это исправить?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.05.2012, 23:29     Удалить первый элемент из списка #8
Чистый, написать конструктор копии, примерно такой:
C++
1
2
3
4
5
6
7
list::list(const list& source):
head(0),
kol(0)
{
    for (element *it = source.head; it != 0; it = it->next)
        add(it->a);
}
Чистый
Автор FAQ
 Аватар для Чистый
2572 / 1379 / 70
Регистрация: 08.09.2011
Сообщений: 3,705
Записей в блоге: 1
28.05.2012, 09:46  [ТС]     Удалить первый элемент из списка #9
спс завтра буду пробовать!

Добавлено через 10 часов 11 минут
так получается в большинстве случаев при перегрузке операторов унарных надо перегружать и конструктор копии?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 10:20     Удалить первый элемент из списка
Еще ссылки по теме:

Удалить первый элемент односвязного списка C++
C++ Удалить из массива А (20) первый отрицательный элемент
C++ Удалить из списка первый элемент с четным информационным полем

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.05.2012, 10:20     Удалить первый элемент из списка #10
Чистый, нет. Если в классе (обычно в конструкторе, но возможно, и при вызове каких-либо методов) происходит захват ресурса, который не может быть освобождён или в полной мере скопирован самостоятельно (выделение динамической памяти, открытие файла, открытие сокета и т.д.), то обязательно нужно писать конструктор копии, оператор присваивания и деструктор.
Yandex
Объявления
28.05.2012, 10:20     Удалить первый элемент из списка
Ответ Создать тему
Опции темы

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