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

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

04.08.2016, 21:21. Показов 5971. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, что я не так делаю? Элемент не удаляется, а заменяется на число 26. Вот код:
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
#include <iostream>
#include <string>
#include <cstdlib>
#include <clocale>
#include <windows.h>
#include <cstddef>
 
using namespace std;
 
struct elements
{
    int num;
    elements* p_next_num;
};
elements *p_head = NULL;
elements *p_temp = NULL;
 
elements* newNum()
{
    elements* p_num = new elements;
    cout << "Введите значение - ";
    cin >> p_num->num;
    p_num->p_next_num = p_head;
    p_head = p_num;
    return p_num;
}
 
void delNum(int del)
{
    p_temp = p_head;
    while(p_temp != NULL)
    {
        if(p_temp->num == del)
        {
            delete p_temp;
            p_temp = p_temp->p_next_num;
        }
        else
            p_temp = p_temp->p_next_num;
    }
}
 
void printList()
{
    p_temp = p_head;
    while(p_temp != NULL)
    {
        cout << p_temp->num;
        p_temp = p_temp->p_next_num;
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int del;
    for(int i = 0; i < 3; i++)
    {
        newNum();
    }
    printList();
    cout << "Введите значение, которое хотите удалить - ";
    cin >> del;
    delNum(del);
    printList();
    return 0;
}
А вот скрин:
Миниатюры
Удаление элемента из односвязного списка  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2016, 21:21
Ответы с готовыми решениями:

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

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

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

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

8
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
04.08.2016, 22:04 2
Лучший ответ Сообщение было отмечено hax0r как решение

Решение

Цитата Сообщение от hax0r Посмотреть сообщение
delete p_temp;
* * * * * * p_temp = p_temp->p_next_num;
Вы удаляете элемент, а потом обращаетесь к несуществующему, может поэтому.

Добавлено через 25 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void delNum(int del) {
    elements* prev_elem = 0;
    elements *p_temp = p_head;
    while (p_temp != NULL) 
    {
        if (p_temp->num == del) 
        {
            if (prev_elem != NULL)
                prev_elem->p_next_num = p_temp->p_next_num;
            else
                p_head = p_temp->p_next_num;
            delete p_temp;
        }
        prev_elem = p_temp;
        p_temp = p_temp->p_next_num;
    }
}
Вот так работает.
2
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
04.08.2016, 23:39 3
hax0r, вообще странно что работает хоть как-то. При удалении, добавлении, изменении нужно 2 указателя.
т.к. при p_temp (0x000024) и p_temp->next (0x000048), удаляешь некст, следовательно нету связи дальше. И при работе с структурами, классами и прочей фигней привыкайте использовать в качестве аргументов функции указатели.
0
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 45
05.08.2016, 12:21  [ТС] 4
Оо спасибо большое!

Добавлено через 6 минут
Кстати,
Цитата Сообщение от DevAlone Посмотреть сообщение
else
* * * * * * * * p_head = p_temp->p_next_num;
почему здесь p_head, а не p_temp?
0
0 / 0 / 0
Регистрация: 05.08.2016
Сообщений: 5
05.08.2016, 12:40 5
Вот вариант удаления покрасивей. Разберись в нем))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void delNum( int digit )
{
    elements ** tmp = &p_head;
    while( *tmp != NULL )
    {
        if( (*tmp)->num == digit )
        {
              elements * delElement = *tmp;
 
              *tmp = (*tmp)->next;
 
              delete delElement;
        }
        else
         {
             *tmp = (*tmp)->next;
         }
    }
}
0
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 45
05.08.2016, 20:21  [ТС] 6
A_n_t_o_n, ого, сложновато пока что для меня... но все равно спасибо
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
05.08.2016, 21:52 7
Цитата Сообщение от hax0r Посмотреть сообщение
почему здесь p_head, а не p_temp?
Потому что следующей строчкой идёт удаление и если мы поменяет p_temp, то удалим уже не тот элемент.
1
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 45
05.08.2016, 21:55  [ТС] 8
А все, понял, спасибо)
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
05.08.2016, 22:03 9
и ваш вариант не работает. Да и вообще, зачем лишняя косвенность?
Цитата Сообщение от A_n_t_o_n Посмотреть сообщение
elements ** tmp = &p_head;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2016, 22:03
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru