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

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

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
21.12.2013, 12:48     При удалении первого элемента из динамического списка присваивается плохой указатель #1
Проблема появляется только при удалении первого элемента.

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++ Возникает ошибка при удалении динамического массива символов в деструкторе класса
Ошибка при создании 2-го элемента динамического списка C++
C++ Нужно ли при удалении динамического массива присваивать NULL?
При удалении элемента из списка происходит непонятная ошибка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
 Аватар для programina
1912 / 597 / 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
5282 / 4801 / 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;
}
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
22.12.2013, 11:03  [ТС]     При удалении первого элемента из динамического списка присваивается плохой указатель #5
alsav22, спасибо
Yandex
Объявления
22.12.2013, 11:03     При удалении первого элемента из динамического списка присваивается плохой указатель
Ответ Создать тему

Метки
динамический список
Опции темы

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