0 / 0 / 0
Регистрация: 21.01.2020
Сообщений: 5
1

Двусвязный список. Проблемы с памятью

07.05.2020, 18:45. Показов 485. Ответов 3

Привет! Суть в том, что мне необходимо удалить отрицательные элементы из списка. При вызове функции Edit_List вылетает ошибка доступа. Проведите ЛикБез пожалуйста(
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
using namespace std;
struct List
{
    int info;
    List* next, * prev;
}*begin, * end, *t;
void Create_List(List**, List**, int);
void Add_List(int, List**, List**, int);
void View_List(int, List*);
void Delete_All(List**);
void Edit_List(List*);
void Delete_items(List*);
int main()
{
    int inf, kod, kod1;
    char Str[2][10] = { "Begin","End" };
    List* begin = new List;
    List* end = new List;
    begin = NULL;
    end = NULL;
    while (true)
    {
        cout << "\n\t1.Create\n\t2.Add\n\t3.View\n\t4.Edit\n\t5.Del\n\t0.Exit\n\t";
        cin >> kod;
     switch (kod)
     {
        case 1: if (begin != NULL)
        {
            cout << "You need to clear RAM!\n";
            break;
        }
              cout << "Begin info: ";
              cin >> inf;
              Create_List(&begin, &end, inf);
              cout << "Create Begin: " << begin->info << endl;
              break;
        case 2:
            cout << "Info: "; cin >> inf;
            cout << "\n0.Add begin/1.Add end: "; cin >> kod1;
            Add_List(kod1, &begin, &end, inf);
            if (kod1 == 0)
                t = begin;
            else
                t = end;
            cout << "Add to " << Str[kod1] << " " << t->info << endl;
            break;
        case 3: if (!begin)
        {
            cout << "The stack is empty!\n";
            break;
        }
              cout << "0.View begin/1.View End: ";
              cin >> kod1;
              if (kod1 == 0)
              {
                  t = begin;
                  cout << "___Begin___\n";
              }
              else
              {
                  t = end;
                  cout << "___End___\n";
              }
              View_List(kod1, t);
              break;
        case 4: Edit_List(begin); break;
        case 5: Delete_All(&begin);
            cout << "Memory cleared!\n";
            break;
        case 0:if (begin != NULL)
            Delete_All(&begin);
            return 0;
     }
    }
    return 0;
}
void Create_List(List** bef, List** en, int inf)
{
    t = new List;
    t->info = inf;
    t->next = t->prev = NULL;
    *bef = *en = t;
}
void Add_List(int kod, List**bef, List**en, int inf)
{
    t = new List;
    t->info = inf;
    if (kod == 0) 
    {
        t->prev = NULL;
        t->next = *bef;
        (*bef)->prev = t;
        *bef = t;
    }
    else
    {
        t->next = NULL;
        t->prev = *en;
        (*en)->next = t;
        *en = t;
    }
}
void View_List(int kod, List* t)
{
    while (t != NULL)
    {
        cout << t->info << endl;
        if (kod == 0) t = t->next;
        else t = t->prev;
    }
}
void Delete_All(List **begin)
{
    List* temp;
    while (*begin != NULL)
    {
        temp = *begin;
        *begin = (*begin)->next;
        delete temp;
    }
    begin = NULL;
}
 
void Edit_List(List* bef)
{
    while (bef != NULL)
    {
        if (bef->info < 0)
            Delete_items(bef);
        bef = bef->next;
    }
}
void Delete_items(List* item)
{
    item->prev->next=item->next;
    item->next->prev = item->prev;
    delete item;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2020, 18:45
Ответы с готовыми решениями:

Преобразовать линейный двусвязный список в кольцевой двусвязный
Приветствую. Помогите разобраться как преобразовать линейный двусвязный список в кольцевой...

Переделать двусвязный список в двусвязный кольцевой
Здравствуйте, у меня єсть двусвязный список однако он не кольцевой! как это запрограммировать? и...

Сформировать список из 10 работников, используя динамическую структуру данных двусвязный список
спасайте Сформировать список из 10 работников, используя динамическую структуру данных...

Двусвязный список (в конец двусвязного списка добавить другой список)
здравствуйте, подскажите пожалуйста, как в конец двусвязного списка добавить другой список?

3
6574 / 4559 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
07.05.2020, 19:37 2
Цитата Сообщение от Zaharios Посмотреть сообщение
Привет! Суть в том, что мне необходимо удалить отрицательные элементы из списка. При вызове функции Edit_List вылетает ошибка доступа. Проведите ЛикБез пожалуйста(
Потому что ты там сначала удаляешь элемент Delete_items(bef);, а потом пытаешься к нему обратиться bef = bef->next;
0
0 / 0 / 0
Регистрация: 21.01.2020
Сообщений: 5
07.05.2020, 19:38  [ТС] 3
А как лучше сделать, дружище?
0
0 / 0 / 0
Регистрация: 21.01.2020
Сообщений: 5
09.05.2020, 10:44  [ТС] 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
List* Edit_List(List* bef,List**end)
{
    List* spt = bef;
    while (spt != NULL)
    {
        List* t = NULL;
        if (spt->prev!=NULL && spt->next != NULL)
        if (spt->info < 0)
        {
            t = spt;
            spt->next->prev = spt->prev;
            spt->prev->next = spt->next;
        }
        spt = spt->next;
        delete t;
    }
    if (bef->info < 0)
    {
        List* t = NULL;
        t = bef;
        t->next->prev = NULL;
        bef = bef->next;
        delete t;
    }
    if ((*end)->info < 0)
    {
        List* t = NULL;
        t = (*end);
        t->prev->next = NULL;
        (*end) = (*end)->prev;
        delete t;
    }
    return bef;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2020, 10:44
Помогаю со студенческими работами здесь

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

Заменить массив структур на односвязный список, и на двусвязный список
Взять текст задания и заменить массив структур на односвязный список, и на двусвязный список ...

Создать двусвязный список групп факультета, где каждая группа представляет собой односвязный список студентов
Задание: создайте двусвязный список групп факультета. Каждая группа представляет собой односвязный...

проблемы с памятью....
с алгоритмом вроде все нормально но вот происходит такая вещи при определенном действии выдается...

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

Проблемы с памятью
Подскажите, кто может. При использовании в данном коде Base до 1000 всё работает хорошо. При...


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

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

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