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

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

Войти
Регистрация
Восстановить пароль
 
klik07
3 / 3 / 0
Регистрация: 17.11.2013
Сообщений: 33
#1

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

18.01.2014, 00:35. Просмотров 619. Ответов 4
Метки нет (Все метки)

Нужно написать собственный контейнер в виде односвязного списка. Удаление элементов из середины и конца я сделал, но не могу придумать как удалить первый элемент. вот часть кода
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
...
...
...
struct List { // элемент списка
    IBase *info;
    List* next;
};
  
 
class storage  {   // сам контейнер
private:
    List *p;
    List *first; // указатель на начало списка
    int n; // количество непустых ячеек
    List *obj; //текущий элемент
public:
    storage() { // конструктор по умолчанию
        first = NULL;
        n = 0;
        obj = NULL;
        p = NULL;
    }
    ~storage() {
        cout << "Деструктор";
    }
    void add_1_obj(IBase *A) {
        // Создать новый элемент списка
        p = new List;
        p->info = A;
 
        // Присоединить новый элемент 
        //к началу списка
        p->next = first ;
        first = p;
        n++; // считаем кол-во элементов
    }
        void delete_all_storage() {     // удаление всего контейнера
        while (first) {
            p = first;
            first = first->next;
            delete p;
        }
        n = 0;
        cout << "Udalenie" << endl << endl;
    }
    List *first1(){ // первый элемент
        obj = first;
        return obj;
     }
    List *next(){ // следующий элемент
        List *tmp = obj;
        obj = tmp->next;
        return obj;
    }
    bool eol() {   // проверка на "пустоту" 
        if (obj != NULL)
            return true;
        else
            return false;
    }
        void delete() {
        if (obj->next == NULL) {        // удаляем последний элемент
            List *tmp = obj;
            first1();
            while (obj->next != tmp)
                this->next();
            obj->next = NULL;
            delete tmp;
            n--;
            return;
        }
        if (obj==first) {
            
                        // вот здесь как быть
 
            n--;
            return;
        }
        List *tmp = obj;   // удаляем элемент из середины
        first1();
        while (obj->next != tmp)
            this->next();
        obj->next=tmp->next;
        delete tmp;
        n--;
    }
        ...
        ...
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2014, 00:35     Удалить первый элемент односвязного списка
Посмотрите здесь:

C++ Поменять местами первый и последний элементы списка и удалить их средне арифметическое
C++ Надо удалить n-ный элемент списка, при том, что он не первый и не последний
Найти наименьший элемент односвязного линейного списка C++
Удалить элемент из односвязного списка C++
C++ Удалить первый элемент из списка
C++ Удалить первый элемент списка
Из списка удалить первый из четных элементов C++
Удалить элемент из односвязного списка C++
C++ Добавить элемент в конец односвязного списка
C++ Удалить из односвязного линейного списка определенный узел
C++ Удалить из списка первый элемент с четным информационным полем
Создание и вывод односвязного списка (выводится только первый элемент) C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
18.01.2014, 00:40     Удалить первый элемент односвязного списка #2
Вроде так) Первое что пришло в голову.
C++
1
2
3
List*  temp=first;
first=first->next;
delete temp;
klik07
3 / 3 / 0
Регистрация: 17.11.2013
Сообщений: 33
18.01.2014, 00:58  [ТС]     Удалить первый элемент односвязного списка #3
Цитата Сообщение от _script_ Посмотреть сообщение
Вроде так) Первое что пришло в голову.
C++
1
2
3
List*  temp=first;
first=first->next;
delete temp;
Вроде работает удаление, но сложность в том что мне надо всегда знать какой элемент в списке является текущим(переменная obj) . в дальнейшем в моей проге используется такая строка
C++
1
2
    for (my_storage->first1(); my_storage->eol(); my_storage->next()) 
        // здесь что-то делаем с текущим элементом
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
18.01.2014, 01:04     Удалить первый элемент односвязного списка #4
Для каких целей нужен текущий?
И что с ним надо делать?
klik07
3 / 3 / 0
Регистрация: 17.11.2013
Сообщений: 33
18.01.2014, 01:22  [ТС]     Удалить первый элемент односвязного списка #5
Ну чтобы мы могли совершать какие-то действия над текущим элементом в списке, пробегая по нему[списку]. Как-то так.

ураааааа заработало
добавил в ваш код одну строку obj->next = first
всё гениальное просто) уже 2 часа убил из-за этой проблемы. Спасибо)
C++
1
2
3
4
5
6
7
8
if (obj==first) {
            List *tmp = first;
            first = first->next;
            delete tmp;
            obj->next = first;
            n--;
            return;
        }
Yandex
Объявления
18.01.2014, 01:22     Удалить первый элемент односвязного списка
Ответ Создать тему
Опции темы

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