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

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

Войти
Регистрация
Восстановить пароль
 
Керра
1276 / 444 / 45
Регистрация: 24.08.2011
Сообщений: 2,133
#1

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

21.12.2013, 12:48. Просмотров 336. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2013, 12:48     При удалении первого элемента из динамического списка присваивается плохой указатель
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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:~/Рабочий стол$
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 18:03     При удалении первого элемента из динамического списка присваивается плохой указатель #3
В udaliti() указатель по ссылке нужно передавать, вы же там вот это делаете:
C++
1
pervyi = pervyi->sled; // второй становится первым
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2013, 11:03     При удалении первого элемента из динамического списка присваивается плохой указатель
Еще ссылки по теме:

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

Вылет программы при удалении динамического массива - 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; А вот его удаление: ...


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

Или воспользуйтесь поиском по форуму:
Керра
1276 / 444 / 45
Регистрация: 24.08.2011
Сообщений: 2,133
22.12.2013, 11:03  [ТС]     При удалении первого элемента из динамического списка присваивается плохой указатель #5
alsav22, спасибо
Yandex
Объявления
22.12.2013, 11:03     При удалении первого элемента из динамического списка присваивается плохой указатель
Ответ Создать тему
Опции темы

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