2 / 2 / 0
Регистрация: 08.09.2013
Сообщений: 49
1

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

05.12.2014, 00:58. Показов 2203. Ответов 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
шКодер самоучка
2175 / 1882 / 912
Регистрация: 09.10.2013
Сообщений: 4,137
Записей в блоге: 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
шКодер самоучка
2175 / 1882 / 912
Регистрация: 09.10.2013
Сообщений: 4,137
Записей в блоге: 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Эксперт С++
10820 / 5841 / 1585
Регистрация: 18.10.2014
Сообщений: 14,496
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
Copyright ©2000 - 2023, CyberForum.ru