С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
BazNick
95 / 0 / 1
Регистрация: 12.07.2016
Сообщений: 73
Завершенные тесты: 2
1

Удаление головы в Связном списке C++

23.01.2017, 23:55. Просмотров 386. Ответов 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
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
137
138
139
#include <iostream>
 
using namespace std;
 
struct Node 
{
    int x;
    Node* next;
};
 
void delEl(Node* head, int value)
{
    if (head == NULL)
    {
        cout << "List is empty\n";
    }
    else
    {
 
        Node* curr = head;
        Node* temp = NULL;
 
        while (curr != NULL)
        {
            if (curr->x == value)
            {
                break;
            }
            else
            {
                temp = curr;
                curr = curr->next;
            }
        }
 
        if (curr == NULL)
        {
            cout << "Number " << value << " is not in the list\n";
        }
        else
        {
            if (curr == head)
            {
                head = head->next;
                
            }
            else
            {
                temp->next = curr->next;
                
            }
                        delete curr;
            cout << "Number " << value << " was deleted\n";
            cout << endl;
        }
    }
}
 
void show(Node* head)
{
    if (head == NULL)
    {
        cout << "There are no numbers in the list\n";
    }
    Node* temp = head;
    while (temp != NULL)
    {
        cout << temp->x << ' ';
        temp = temp->next;
    }
    cout << endl;
}
 
int main()
{
    Node* head = NULL;
    
    int choice;
    cout << "~~~~~~~~~~~~~ Linked List ~~~~~~~~~~~~~\n\n";
    cout << "1. Enter numbers\n";
    cout << "2. Show list\n";
    cout << "3. Delete number\n";
    
    while (true)
    {
        cin >> choice;
        switch (choice)
        {
 
        case 1: 
            while (true)
            {
                Node p;
                cout << "Enter number (enter negative number to exit): ";
                cin >> p.x;
                if (p.x < 0)break;
 
                Node* curr = new Node;
                curr->x = p.x;
                curr->next = NULL;
                if (head == NULL)
                {
                    head = curr;
                }
                else
                {
                    Node* temp = head;
                    while (temp->next != NULL)
                    {
                        temp = temp->next;
                    }
                    temp->next = curr;
                    curr->next = NULL;
                }
            }
            break;
        case 2: show(head);
            break;
        case 3: cout << "Enter number which you want to delete?\n";
            int number;
            cin >> number;
            delEl(head, number);
            break;
        default: cout << "Goodbye! =)\n";
            cin.ignore();
            cin.get();
            return 0;
        }
        cout << "~~~~~~~~~~~~~ Linked List ~~~~~~~~~~~~~\n\n";
        cout << "1. Enter numbers\n";
        cout << "2. Show list\n";
        cout << "3. Delete number\n";
    }
 
    
    delete head;
    
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2017, 23:55
Ответы с готовыми решениями:

Очередь на связном списке
OldTail-&gt;next-&gt;tail; ругается на эту строчку, пишет class QueueNode не содержит...

непонятка в связном списке
есть 2 конструктора - list(const str&amp;) и list() если в main использую 1ый...

Пузырёк на связном списке
Здравствуйте! Не могли Вы подсказать, почему после первого прохождения по...

Исправить ошибки в связном списке
Почти готовая лабораторка, но не хватает несколько деталей. Помогите решить...

Алгоритм Дейкстры в связном списке + файлы.
Задача такова : Имеются n городов. Некоторые из них соединены дорогами...

6
nonedark2008
1124 / 832 / 249
Регистрация: 28.07.2012
Сообщений: 2,334
24.01.2017, 00:00 2
Цитата Сообщение от BazNick Посмотреть сообщение
head = head->next;
Бесполезная операция. delEl принимает на вход копию указателя, так что эта операция меняет только локальную копию.
Передавай переменную по ссылке или указатель на нее.
0
BazNick
95 / 0 / 1
Регистрация: 12.07.2016
Сообщений: 73
Завершенные тесты: 2
24.01.2017, 00:19  [ТС] 3
Как это относится к ошибке, которую выдает мне компилятор?
0
nonedark2008
1124 / 832 / 249
Регистрация: 28.07.2012
Сообщений: 2,334
24.01.2017, 00:29 4
BazNick, представь список из одного элемента, который ты хочешь удалить.
Пусть head = 0x11
Ты вызываешь функцию delEl, и передаешь туда КОПИЮ head. Обозначим ее как head_copy.
Затем ты делаешь head_copy = head_copy->next; delete head_copy; и выходишь из функции.
Можешь удивляться сколько угодно, но после выхода из функции все так же head = 0x11, а не head->next.
При этом ты еще и память их под head удалил, так что при обращенни к нему получаешь ошибку доступа.

Добавлено через 3 минуты
Цитата Сообщение от BazNick Посмотреть сообщение
Как это относится к ошибке
Не знаю. Наверно потому, что у тебя где-то ошибка, может она и не одна.
Впредь, хотя бы пиши текст ошибки. Вдруг я нашел какую-то ошибку, которая непосредственно не связана с той ошибкой, которая у тебя сейчас.
0
BazNick
95 / 0 / 1
Регистрация: 12.07.2016
Сообщений: 73
Завершенные тесты: 2
24.01.2017, 00:36  [ТС] 5
Спасибо, вразумил =)
Ошибка была именно из-за этого.

Добавлено через 5 минут
Кстати вопрос, почему работает именно так?
Почему надо передавать указатель на ссылку?
Можешь объяснить, если не сложно?
0
nonedark2008
1124 / 832 / 249
Регистрация: 28.07.2012
Сообщений: 2,334
24.01.2017, 00:44 6
Цитата Сообщение от BazNick Посмотреть сообщение
передавать указатель на ссылку?
Указатель на ссылку? Пф. Ссылка на указатель.
Я же примерно (хоть и с некоторыми ошибками) объяснил выше.
У тебя в main есть head. Ты хочешь этот head изменить в функции delEl. Решение: передать head по ссылке или указатель на него &head. В твоем случае ты передаешь head по значению, т.е. значение head в мейне ты изменить никак не сможешь.
0
BazNick
95 / 0 / 1
Регистрация: 12.07.2016
Сообщений: 73
Завершенные тесты: 2
24.01.2017, 00:54  [ТС] 7
Можно было и без ПФ. Ошибся, с кем не бывает.
Но спасибо за наставление!
0
24.01.2017, 00:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2017, 00:54

Copy-Constructor В Шаблонном Связном списке
Скажіте пожалуйста где тут ошыбка? Добавлено через 49 секунд Ран тайм ерор...

Как удалить узел в связном списке?
привет всем! подскажите пожалуйста в подробностях как происходит удаление узла...

Как в связном списке обратиться к элементу по адресу
как в связном списке обратиттся к элементу по нужному адресу? Добавлено...


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

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

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