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

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

Войти
Регистрация
Восстановить пароль
 
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
#1

При удалении первого элемента из динамического списка присваивается плохой указатель - C++

21.12.2013, 12:48. Просмотров 347. Ответов 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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Запись содержит марку автобуса, максимальную скорость, вместимость. 
// Удалить из списка записи с автобусами, вместимость которых ниже 25 пассажиров 
// и максимальной скоростью выше 120 км/ч.
 
#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <conio.h>
 
struct Avtobus
{
    char marka[40];
    unsigned int max_skorosti, vmestimosti;
    Avtobus *sled;
};
 
void prochitati(Avtobus *&pervyi) // & чтобы указатель можно было изменять
{
    unsigned int n;
    cout << "Vvedite kolichestvo avtobusov: ";
    scanf("%i%*c",&n);
 
    if (n == 0)
    {
        pervyi = NULL;
        return;
    }
    else
        pervyi = new Avtobus;
    cout << endl << "Avtobus nr.1" << endl;
    cout << "Marka: ";
    gets(pervyi->marka);
    cout << "Maximalinaia skorosti: ";
    cin >> pervyi->max_skorosti;
    cout << "Vmestimosti: ";
    scanf("%i%*c",&pervyi->vmestimosti);
    cout << endl;
 
    Avtobus *tek = pervyi;
    for (int i = 2; i <= n; i++)
    {
        tek->sled = new Avtobus;
        tek = tek->sled;
        cout << "Avtobus nr." << i << endl;
        cout << "Marka: ";
        gets(tek->marka);
        cout << "Maximalinaia skorosti: ";
        cin >> tek->max_skorosti;
        cout << "Vmestimosti: ";
        scanf("%i%*c",&tek->vmestimosti);
        cout << endl;
    }
    tek->sled = NULL;
}
 
void udaliti(Avtobus *pervyi)
{
    Avtobus *tmp;
    while ((pervyi != NULL) && (pervyi->vmestimosti < 25) && (pervyi->max_skorosti > 120))
    { // удаляем из начала
        tmp = pervyi; // сохраняем адрес первого
        pervyi = pervyi->sled; // второй становится первым
        delete tmp; // освобождаем память
    }
    if (pervyi == NULL) // если удалили все - выходим
        return;
    
    Avtobus *tek = pervyi;
    while (tek->sled != NULL) // пока список не закончился
        if ((tek->sled->vmestimosti < 25) && (tek->sled->max_skorosti > 120))
        {
            tmp = tek->sled; // сохраняем адрес
            tek->sled = tek->sled->sled; // следующий после следующего становится следующим
            delete tmp; // освобождаем память
        } // если мы удалили элемент, то надо снова проверять следующий, поэтому не меняем tek
        else
            tek = tek->sled; // не удалили - смотрим на следующий
}
 
void print(Avtobus *pervyi)
{
    Avtobus *tek = pervyi;
    while (tek != NULL)
    {
        cout << "Marka: " << tek->marka
            << ", max.skor.: " << tek->max_skorosti
            << ", vmest.: " << tek->vmestimosti << endl;
        tek = tek->sled;
    }
    cout << endl << endl;
}
 
int main()
{
    Avtobus *spisok;
    prochitati(spisok);
    cout << "Do udalenia: " << endl << endl;
    print(spisok);
    getch();
    udaliti(spisok);
    cout << "Posle udalenia:" << endl << endl;
    print(spisok);
    getch();
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2013, 12:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При удалении первого элемента из динамического списка присваивается плохой указатель (C++):

При удалении элемента из списка вылетает программа - C++
Здравствуйте, помогите, пожалуйста. У меня есть программа по работе с классами и списком (код ниже). Добавление элементов в список и их...

При удалении элемента из списка происходит непонятная ошибка - C++
Приложила файл, который должен лежать в папке с кодом. При выполнении на первом поиске ищете &quot;nazv1&quot;, и потом его удаляете. И после этого...

Ошибка при создании 2-го элемента динамического списка - C++
НЕ могу понять откуда как исправить данную ошибка . Выскакивает как мне кажется при попытке динамически выделить память для указателя на...

Изменится ли указатель конца при вставке элемента в конец односвязаного списка? - C++
Привет, можешь помочь прояснить ситуацию (Тема односвязный список) #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; ...

Ошибка при удалении динамического массива - C++
Добрый вечер! Ругается на HEAP CORRUPTION DETECTED в строке с delete vertex; В чём может быть дело? void read_stl (char*...

Ошибка при удалении динамического массива - C++
Доброго времени суток! ПРоблема заключается в том, что при попытке очистить память из под динамического массива вылетает ошибка &quot;access...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
21.12.2013, 14:40 #2
Керра,
Bash
user@comp:~/Рабочий стол$ ./t
Vvedite kolichestvo avtobusov: 3
 
Avtobus nr.1
Marka: zil
Maximalinaia skorosti: 130
Vmestimosti: 20
 
Avtobus nr.2
Marka: vaz
Maximalinaia skorosti: 50
Vmestimosti: 50
 
Avtobus nr.3
Marka: gaz
Maximalinaia skorosti: 100
Vmestimosti: 40
 
Do udalenia: 
 
Marka: zil, max.skor.: 130, vmest.: 20
Marka: vaz, max.skor.: 50, vmest.: 50
Marka: gaz, max.skor.: 100, vmest.: 40
 
 
Posle udalenia:
 
Marka: , max.skor.: 130, vmest.: 20
Marka: vaz, max.skor.: 50, vmest.: 50
Marka: gaz, max.skor.: 100, vmest.: 40
 
 
user@comp:~/Рабочий стол$
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 18:03 #3
В udaliti() указатель по ссылке нужно передавать, вы же там вот это делаете:
C++
1
pervyi = pervyi->sled; // второй становится первым
0
IrineK
Заблокирован
22.12.2013, 00:18 #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
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
// Запись содержит марку автобуса, максимальную скорость, вместимость. 
// Удалить из списка записи с автобусами, вместимость которых ниже 25 пассажиров 
// и максимальной скоростью выше 120 км/ч.
 
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
typedef struct _Bus
{   char brand [20];
    int maxSpeed;
    int maxCapacity;
    struct _Bus *next;
} TBus;
 
 
TBus* BusStack ()
{   TBus * buses = NULL, *start;
    unsigned int i, n;
    cout << "Number of buses in stack N = : ";
    cin>>n;
    cin.sync();
 
    if (n==0)
        return NULL;
    
    buses = new TBus;
    cout << endl << "Bus No 1" << endl;
    cout << "Brand: ";
    fgets(buses->brand, 40, stdin);
    buses->brand [strlen(buses->brand) - 1] = '\0';
    cout << "Maximum speed: ";
    cin >> buses->maxSpeed;
    cout << "Maximum capacity: ";
    cin >> buses->maxCapacity;
    cin.sync();
    cout << endl;
    start = buses;
 
    for (i = 2; i <= n; i++)
    {   buses->next= new TBus;
        buses = buses->next;
        cout << endl << "Bus No " << i << endl;
        cout << "Brand:";
        fgets(buses->brand, 40, stdin);
        buses->brand [strlen(buses->brand) - 1] = '\0';
        cout << "Maximum speed: ";
        cin >> buses->maxSpeed;
        cout << "Maximum capacity: ";
        cin >> buses->maxCapacity;
        cin.sync();
        cout << endl;
    }
    buses->next = NULL;
    return start;
}
 
void Print (TBus *buses)
{   if (!buses)
    {   cout<<"No buses\n";
        return;
    }
    while (buses)
    {   cout << "Brand: " << buses->brand
            << ", max speed: " << buses->maxSpeed
            << ", max capacity: " << buses->maxCapacity << endl;
        buses = buses ->next;
    }
    cout << endl << endl;
}
 
TBus *DelFront (TBus *buses)
{   TBus *temp, *del;
    
    if (!buses)
        return NULL;
 
    if(!buses->next)
    {   del = NULL;
        delete buses;
    }
    else
    {   temp = buses;
        del = buses->next;
        delete temp;
    }
    return del;
}
 
void Clear(TBus* buses)
{   while (buses)
        buses = DelFront(buses);
}
 
TBus *Filter (TBus *buses, int speed, int capacity)
{   TBus *newBuses = NULL;
    TBus *start = NULL;
    while (buses)
    {   if(!(buses->maxSpeed > speed && buses->maxCapacity < capacity))
        {   newBuses = new TBus;
            *newBuses = *buses;
            newBuses->next = NULL;
            start = newBuses;
            buses = buses->next;
            break;
        }
        buses = buses->next;
    }
    while (buses)
    {   if(!(buses->maxSpeed > speed && buses->maxCapacity < capacity))
        {   newBuses->next = new TBus;
            newBuses = newBuses->next;
            *newBuses = *buses;
            newBuses->next = NULL;
        }
        buses = buses->next;
    }
    return start;
}
 
 
int main()
{   TBus *buses = BusStack ();
    cout << "The whole stack:\n";
    Print (buses);
    
    TBus *filtered = Filter (buses, 120, 25);
    cout << "The filtered stack:\n";
    Print (filtered);
 
    Clear (buses);
    Clear (filtered);
    cin.get();
    return 0;
}
0
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
22.12.2013, 11:03  [ТС] #5
alsav22, спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2013, 11:03
Привет! Вот еще темы с ответами:

Ошибка при удалении динамического массива - C++
Непонятная мне ошибка при удалении массива #include &lt;iostream&gt; #include &lt;conio.h&gt; using std::cout; using std::cin; using...

Вылет программы при удалении динамического массива - C++
Писал программу с использованием динамического массива, все компилилось нормально, но в какой-то момент программа просто начала вылетать,...

Heap corruption detected при удалении динамического массива - C++
mystring.cpp - здесь происходит ошибка в функции MyString::operator на строке delete s. В чем тут может быть дело? #include &quot;mystring.h&quot; ...

Нужно ли при удалении динамического массива присваивать NULL? - C++
Вот создал я динамический массив N на M: int **mas; mas=new int*; for(i=0;i&lt;n;i++) mas=new int; А вот его удаление: ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.12.2013, 11:03
Ответ Создать тему
Опции темы

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