Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
2 / 2 / 0
Регистрация: 08.09.2013
Сообщений: 49
1

Удаление элемента из односвязного списка

05.12.2014, 00:58. Показов 1910. Ответов 6
Метки нет (Все метки)

Здравствуйте, мне надо, чтобы элементы у которых средний балл был ниже были удалены в односвязном списке.
Подскажите, как это сделать. При указание балла компилятор прекращает работу.



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
#include<iostream>
#include<string>
using namespace std;
void menu();
void add();
void del(float);
void showgroup(int);
 
struct data{
    string fio;
    int gruppa;
    float mark;
    data* next;
};
data* first = NULL;
int main()
{
    do{
         menu();
 
    } while (true);
    system("pause");
    return 0;
}
 
void del(float mar){
    data* current = first;           // начинаем с первого элемента
    data* dele;
    while (current)                 // пока есть данные
    {
        if (current->mark < mar){
            dele = current->next;
            delete current;
            current = dele->next;
        }
        else
            current = current -> next;
          // двигаемся к следующему элементу
    }
 
}
 
void showgroup(int gr){
    data* current = first;           // начинаем с первого элемента
    while (current)                 // пока есть данные
    {
        if (current->gruppa == gr){
            cout << "ФИО: " << current->fio << endl;
            cout << "Группа: " << current->gruppa << endl;
            cout << "Средний балл: " << current->mark << endl;
        }
        current = current->next; // двигаемся к следующему элементу
        cout << endl;
    }
 
}
 
 
void menu(){
    setlocale(LC_ALL, "Russian");
    cout << "Добавить аккаунт студента -1 " << endl;
    cout << "Удаление всех аккаунтов ниже среднего балла-2" << endl;
    cout << "Отобразить аккаунты из группы-3" << endl;
    cout << "Если вы хотите закрыть программу - 0" << endl;
    int n;
    cin >> n;
    switch (n){
    case 0: exit(0);
    case 1: add(); break;
    case 2:
        cout << "Введите средний балл:" << endl;
        float sredmark;
        cin >> sredmark;
        del(sredmark); break;
    case 3: cout << "Введите группу: " << endl;
        int group;
        cin >> group;
        showgroup(group); break;
    }
 
    
}
 
void add(){
    data* newlink = new data;
    cout << "Введите ФИО: " << endl;
    cin >> newlink->fio;
    cout << "Введите группу: " << endl;
    cin >> newlink->gruppa;
    cout << "Введите средний балл: " << endl;
    cin >> newlink->mark;
    newlink->next = first;
    first = newlink;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2014, 00:58
Ответы с готовыми решениями:

Удаление элемента односвязного списка
Здравствуйте. Написал вот такой код. В программе происходит создание списка, вывод его на экран, а...

Удаление элемента из односвязного списка
Здравствуйте. Делаю односвязный список. Добавил методы Add и Print, но вот метод Delete вылетает. ...

Удаление элемента из односвязного списка
Ребят, что я не так делаю? Элемент не удаляется, а заменяется на число 26. Вот код: #include...

Удаление первого элемента односвязного списка
Здравствуйте!Написана программа для работы с односвязным списком,все хорошо,но нет удаление первого...

6
шКодер самоучка
2145 / 1856 / 907
Регистрация: 09.10.2013
Сообщений: 4,055
Записей в блоге: 7
05.12.2014, 01:03 2
34я строка
C++
1
current = dele;//->next;// в dele и так уже следующий элемент
0
2 / 2 / 0
Регистрация: 08.09.2013
Сообщений: 49
05.12.2014, 01:21  [ТС] 3
Так я его потом присваиваю после удаления, освободившемуся current, чтобы проверялось условие цикла.
Можете написать как правильно, мне просто на завтра надо сдать лабораторную, буду премного благодарен.
0
шКодер самоучка
2145 / 1856 / 907
Регистрация: 09.10.2013
Сообщений: 4,055
Записей в блоге: 7
05.12.2014, 01:30 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void del(float mar){
    data* current = first;           // начинаем с первого элемента
    data* dele;
    while (current)                 // пока есть данные
    {
        if (current->mark < mar){
            dele = current->next;//<-------------------------------------------+
            delete current;      //                                            |
            current = dele;      //->next;// в dele и так уже следующий элемент+
        }
        else
            current = current -> next;
          // двигаемся к следующему элементу
    }
 
}
Добавлено через 3 минуты
у Вас происходит разименовывание нулевого указателя при удалении последнего элемента списка
0
2 / 2 / 0
Регистрация: 08.09.2013
Сообщений: 49
05.12.2014, 01:35  [ТС] 5
все равно пишет ошибку Unhandled exception at 0x003462D0 in ConsoleApplication93.exe: 0xC0000005: Access violation reading location 0xFEEEFF06.
0
С чаем беда...
Эксперт CЭксперт С++
9257 / 4757 / 1288
Регистрация: 18.10.2014
Сообщений: 10,817
05.12.2014, 01:36 6
Цитата Сообщение от Siquel Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void del(float mar){
    data* current = first; // начинаем с первого элемента
    data* dele;
    while (current) // пока есть данные
    {
        if (current->mark < mar)
        {
            dele = current->next;
            delete current;
            current = dele->next;
        }
        else
            current = current -> next;
            // двигаемся к следующему элементу
    }
}
Во-первых, при таком общем способе удаления ситуацию с удалением самого первого элемента списка надо обрабатывать особо. Вы этого не сделали. В результате, если будет удален самый первый элемент, указатель 'first' останется указывать "в никуда".

Во-вторых, как уже заметил Cra3y, вы делаете лишний шаг вперед после удаления элемента.

Чтобы не надо было выписывать особую обработку удаления первого элемента, стоит воспользоваться идиомой с двойным указателем:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void del(float mar)
{
    data** pnext = &first;
    while (*pnext)
    {
        data *current = *pnext;
        if (current->mark < mar)
        {
            *pnext = current->next;
            delete current;
        }
        else
            pnext = &current->next;
    }
}
0
2 / 2 / 0
Регистрация: 08.09.2013
Сообщений: 49
05.12.2014, 01:53  [ТС] 7
Больше спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2014, 01:53

Удаление из односвязного списка заданного элемента
Структура содержит название, цену, количество товара. Удалить из списка заданный товар.

Удаление первого элемента односвязного списка
не могу понять как удалить первый элемент в односвязном списке. #include &lt;iostream&gt; using...

Удаление последнего элемента односвязного списка
как сделать в списке pop_back и полное очищение? struct Node { int value; Node* next;...

Удаление элемента из односвязного списка, представленного классом
Описание списка class link // один элемент списка { public: char* data; // некоторые данные...


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

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

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