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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как лучше переделать программу чтобы отсутствовали глобальных переменных http://www.cyberforum.ru/cpp-beginners/thread1050653.html
есть программа, как лучше переделать программу что бы отсутствовали глобальных переменных, т.е. чтобы все передавалось через параметры. прошу с комментариями. /* Igra v Kpestiki Noliki */ #include...
C++ Программа работы с файлами. Информация о студентах. Нужно создать программу, которая обрабатывала б базы данных, считывала информацию с файла, редактирвала эту информацию, удаляла часть инфы, и сохраняла обратно в файл, а так же поиск в базе по... http://www.cyberforum.ru/cpp-beginners/thread1050652.html
C++ Найти все целые положительные числа a,b,c из промежутка
3) Найти все целые положительные числа a,b,c из промежутка (0,100) такие что a^3+b^2=c^2. P.S. в первой и второй задаче желателен вод с клавиатуры. Заранее благодарю.
Задача про двумерный массив C++
Вот условие: Дана целая матрица размером (n*m) n, m <=10. Упорядочить (переставить) строки матрицы по возрастанию количества положительных элементов в одной строке. #include<stdio.h>...
C++ Нужно объяснение кода про нахождение количества решений для латинского квадрата http://www.cyberforum.ru/cpp-beginners/thread1050629.html
Я не могу понять код, который мне нужно будет уже послезавтра объяснить. Задача состоит в том, чтобы найти количество решений для латинского квадрата и вывести эти квадраты на экран: int...
C++ как написать вывод? Как написать вывод объема тетраэдра (тема класс)? //На вход подается некоторое количество тетраэдров(координаты вершин). //Отсортировать и вывести их по возрастанию объемов. #include <iostream>... подробнее

Показать сообщение отдельно
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214

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

21.12.2013, 12:48. Просмотров 357. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru