С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Чистый
Автор FAQ
2709 / 1405 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 1
#1

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

27.05.2012, 22:49. Просмотров 726. Ответов 9
Метки нет (Все метки)

Всем хай!
Есть задача, создать список и выполнить некие операции надо ним
и так список:
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);
}
который как раз и должен удалить первый элемент но что то при удалении в результате не то что надо остается... Подскажите где накосячил
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2012, 22:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить первый элемент из списка (C++):

Удалить первый элемент списка - C++
Подскажите пожалуйста!!! Как сделать так чтобы в этой программе происходило удаление элемента первого в списке??? В этой программе...

Удалить первый элемент односвязного списка - C++
Нужно написать собственный контейнер в виде односвязного списка. Удаление элементов из середины и конца я сделал, но не могу придумать как...

Удалить из списка первый элемент с четным информационным полем - C++
Здравствуйте,прошу помощи в решение задачи,очень надо сдать,а я не знаю как делать. Сформировать двунаправленный список,Тип...

Надо удалить n-ный элемент списка, при том, что он не первый и не последний - C++
Есть такой код: #include&lt;iostream&gt; #include &quot;rus.h&quot; using namespace std; struct Info { int d; };

Вывести содержимое списка в следующем порядке: первый элемент, последний элемент, второй элемент, предпоследни - C++
#include &lt;iostream&gt; #include &lt;list&gt; #include &lt;iterator&gt; void output(std::list&lt;int&gt; myList, std::list&lt;int&gt;::iterator iter1,...

Проверить, упорядочены ли элементы, заменить первый нулевой элемент и удалить указанный элемент из массива - C++
Найти произведение отрицательных элементов массива, следующих после первого положительного элемента. Если по какой-либо причине вычислить...

9
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
27.05.2012, 22:53 #2
Чистый, выложи полный код. Здесь вроде всё как надо (кроме момента возврата из оператора списка по значению, да и идеологически неверной перегрузки оператора с подобной целью).
0
Чистый
Автор FAQ
2709 / 1405 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 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;
}
и расскажи что не так сделал... Все же я пока учусь и хочу на этом этапе понять что не так что бы потом не пришлось переучиваться
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
27.05.2012, 23:05 #4
Чистый, а реализация списка?
0
Чистый
Автор FAQ
2709 / 1405 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 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++;
     }
}
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
27.05.2012, 23:15 #6
Чистый, ну, собственно, для начала. Не реализован конструктор копии. Значит, что используется предоставляемый компилятором, выполняющий обычное поэлементное копирование. Что происходит при вызове lis::operator--(), а вернее, при возврате из него: поскольку возврат осуществляется по значению, вызывается конструктор копии. Поскольку он не реализован, вызывается стандартный. Поскольку вызывается стандартный, то ни о каком копировании самого списка речи не идёт, копируются только указатели. А поскольку оператор декремента вызывается без приёмника, то возвращённый из него объект тут же и удаляется, т.е. вызывается деструктор. А поскольку оставшийся объект хранил те же адреса, что и временный, возвращённый из оператора --, то и уничтожается реальный список, который присутствует в единственном экземпляре. Рассуждать о том, что происходит дальше, гиблое дело, тут всё на воле случая.
1
Чистый
Автор FAQ
2709 / 1405 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 1
27.05.2012, 23:25  [ТС] #7
так как это исправить?
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 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);
}
1
Чистый
Автор FAQ
2709 / 1405 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 1
28.05.2012, 09:46  [ТС] #9
спс завтра буду пробовать!

Добавлено через 10 часов 11 минут
так получается в большинстве случаев при перегрузке операторов унарных надо перегружать и конструктор копии?
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
28.05.2012, 10:20 #10
Чистый, нет. Если в классе (обычно в конструкторе, но возможно, и при вызове каких-либо методов) происходит захват ресурса, который не может быть освобождён или в полной мере скопирован самостоятельно (выделение динамической памяти, открытие файла, открытие сокета и т.д.), то обязательно нужно писать конструктор копии, оператор присваивания и деструктор.
1
28.05.2012, 10:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 10:20
Привет! Вот еще темы с ответами:

Структура "Информация": - носитель; - объем; - название; - автор. Удалить первый элемент с заданным объемом информации, добавить элемент перед элемент - C++
Структура &quot;Информация&quot;: - носитель; - объем; - название; - автор. Удалить первый элемент с заданным объемом информации, добавить...

Удалить первый положительный элемент массива; вставить новый элемент перед первым максимальным элементом - C++
Дан целочисленный массив размера N. Как удалить первый положительный элемент ? Как вставить новый элемент перед первым максимальным...

Удалить первый элемент с заданным объемом информации, добавить элемент перед элементом с указанным номером - C++
Структура &quot;Информация&quot;: - носитель; - объем; - название; - автор. Удалить первый элемент с заданным объемом информации, добавить...

Удалить первый нулевой элемент массива и добавить после каждого чётного элемента особый элемент - C++
Здравствуйте! Имеется такая задача: 1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел. 2) Распечатать...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.