Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
1

Односвязный список. Крэш программы при выводе

29.07.2016, 13:00. Просмотров 465. Ответов 23
Метки нет (Все метки)

Доброго времени суток, господа. Извиняюсь за повторную тему (вчера такую же создавал с другим вопросом, но не смог найти её ) Проблема следующего рода. При выводе списка, крэшиться программа (
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
#include <iostream>
using namespace std;
 
struct MyStruct
{
    char Model[15];
    int Price;
};
struct List
{
    MyStruct str;
    List * next;
};
void input_struct(MyStruct * x, int n);
void output_struct(MyStruct * x, int n);
void Input(List ** begin);
void Output(List * begin);
 
 
int main()
{
    setlocale(LC_ALL, "russian");
    List * begin = NULL;
    Input(&begin);
    Output(begin);
    
    system("pause");
    return 0;
}
 
 
void input_struct(MyStruct * x, int n)
{
    for (int i(0); i < n; i++)
    {
        cout << "Enter Mystuct elements" << endl;
        cout << "Model " << i + 1 << " :";
        cin >> x[i].Model;
        cout << "Price this auto :";
        cin >> x[i].Price;
        cout << endl;
    }
}
void output_struct(MyStruct * x, int n)
{
    for (int i(0); i < n; i++)
    {
        cout << x[i].Model << '\t' << x[i].Price << endl;
    }
}
void Input(List ** begin)
{
    MyStruct mycar[3];
    input_struct(mycar, 3);
    *begin = new List;
    
 
    List * end = *begin;
 
    for (int i(0); i < 3; i++)
    {
        
        end->next = new List;
        end->str = mycar[i];
        end = end->next;    
    }
    end = NULL;
    
}
void Output(List * begin)                                                                              // Проблема похоже, в этой ф-ции. Пробывал      
                                                                                                               // пробовал выводить через цикл for с 3 итер.                                                     
{                                                                                                             // всё получается. Похоже что в цикле while о
    List * print = begin;                                                                               обращается к какому-то левому адресу(
    while (print)
    {
        cout << print->str.Model << '\t' << print->str.Price << "-->   ";
        print = print->next;
    }
    cout << "NULL";
 
}

Пробовал изменять ф-ции инициализации списка всё тщетно...
Ещё пожалуйста подскажите NULL обнуляет указатель ? или значение по указателю ? В случае если указатель не разименован. Всем заранее спасибо.
0
Миниатюры
Односвязный список. Крэш программы при выводе   Односвязный список. Крэш программы при выводе  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 13:00
Ответы с готовыми решениями:

Крэш программы при работе с кострукторами
Пробую разобраться с конструкторами. Увы пока крэш ( Подскажите #define...

Крэш программы на одном ПК
Доброго времени суток, в с++ я пока только осваиваю азы и т.п. Серверное...

Кирилица отображается нормально при выводе из программы, но иероглифы при вводе в консоль
Что надо подключить что бы в консоли писать русскими буквами? cin &gt;&gt; kol;...

При выводе результата работы программы пишет #QNAN0
При выводе результатов все члены равны 1.#QNAN0 В чем может быть причина...

Сформировать список из 10 книг, используя динамическую структуру данных односвязный список
друзья спасайте Сформировать список из 10 книг, используя динамическую...

23
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
29.07.2016, 13:04  [ТС] 2
хех пока просматривал пост, заметил ошибку. Но остался другой косяк. Есть какой-то не инициализированный список.
0
Миниатюры
Односвязный список. Крэш программы при выводе  
fire_Rising
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
29.07.2016, 13:09 3
kiwokr, заполняется неправильно, остается мусор в конце, либо там ошибка, либо при выводе условия окончания надо поставить

Добавлено через 30 секунд
kiwokr, указатель на след элемент при заполнении надо делать NULL

Добавлено через 25 секунд
а потом уже, когда вводишь элемент, освобождаешь под него память и след элемент делаешь снова NULL

Добавлено через 1 минуту
C++
1
2
end = end->next;
end->next = NULL;
вот так попробуйте
0
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
29.07.2016, 13:10  [ТС] 4
fire_Rising
C++
1
2
3
4
5
6
7
8
    for (int i(0); i < 3; i++)
    {
        
        end->next = new List;
        end->str = mycar[i];
        end = end->next; 
        end->next = NULL;
    }
Вот так я переделал сразу, работать начала но мусор в конце всё равно остается ?
0
fire_Rising
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
29.07.2016, 13:13 5
если так не сработает, то при процедуре вывода изменить цикл while так:
C++
1
2
3
4
while (print->str.Model != 'Н') {
cout << print->str.Model << '\t' << print->str.Price << "-->   ";
print = print->next;
}
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
29.07.2016, 13:14 6
Цитата Сообщение от kiwokr Посмотреть сообщение
Извиняюсь за повторную тему (вчера такую же создавал с другим вопросом, но не смог найти её )
В верхнем правом углу страницы есть ссылка "Мои темы".

И да, один вопрос - одна тема.
1
fire_Rising
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
29.07.2016, 13:15 7
а если так?
C++
1
2
3
4
5
6
7
8
for (int i = 0; i < 3; i++)
    {
        
        end->next = new List;
        end = end->next;
        end->str = mycar[i];
        end->next = NULL;
    }
0
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
29.07.2016, 13:53  [ТС] 8
fire_Rising, очевидно ж что нет, указатель будет перепрыгивать через 1 список.
0
fire_Rising
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
29.07.2016, 15:08 9
kiwokr, почему будет перепрыгивать?, вы выделяете память для следующего элемента, переводите указатель на него и заполняете и пишите, что следующий пустой и так далее

Добавлено через 1 минуту
kiwokr
C++
1
2
3
4
5
6
7
8
for (int i(0); i < 3; i++)
    {
        
        end->next = new List;
        end->str = mycar[i]; //здесь у вас не end->next = mycar[i], а просто end
        end = end->next; //здесь в данном случае вы end = мусору
        end->next = NULL;
    }
у вас тут сильная ошибка в логике, вы заполняете не тот элемент, под который выделили память, а уже существующий пытаетесь перезаписывать без перевода указателя
0
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
29.07.2016, 18:00  [ТС] 10
fire_Rising, это не так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
*begin = new List;  -> вот выделение памяти под первый список.
  List * end = *begin;  
 
   
 
    for (int i(0); i < 3; i++)
    {
        
        end->next = new List;
        end->str = mycar[i];
        end = end->next; 
        end = NULL;   
    }
Я походу понял в чём проблема, но не могу понять как изменить это....
end = end->next; на последней итерации указатель end не должен перейти на следующий эл-нт, а только end->next= NULL;
end = NULL;
0
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:02 11
создание нового списка
begin = new List;
0
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
29.07.2016, 18:13  [ТС] 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    for (int i(0); i < 3; i++)
    {
        
        end->next = new List;
        end->str = mycar[i];
        if (i == 2)
        {
            end->next = NULL;
        }
        else
        {
            end = end->next;
            end->next = NULL;
        }
    }
Вот такой вариант работает, но хотелось бы обойтись без ветвления в цикле (
0
TheBig
-20 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 41
29.07.2016, 18:14 13
если не нужны циклы так их можно убрать.
0
fire_Rising
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
30.07.2016, 20:12 14
kiwokr, мой вариант отлично работает без всяких циклов) если вы такой упертый, это не наши проблемы и стоит закрыть вопрос. Чтобы понять почему у вас ошибка можете посмотреть урок Дениса Маркова односвязный список
0
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
30.07.2016, 20:17  [ТС] 15
fire_Rising,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
for (int i = 0; i < 3; i++)
    {
        
        end->next = new List; - создание нового списка на следующем адресе.
        end = end->next;  - переход указателя на этот адрес
        end->str = mycar[i]; инициализация нового адреса
        end->next = NULL; присваивание следующему адресу значения 0.
            
    }
Где инициализация 1 адреса указателя? её нету... Такой вариант подходит только если у тебя есть список инициализированный, и к нему просто подшиваешь ещё списки. Он весьма скучен и тривиален... я хочу что бы список создавался с нуля...
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
30.07.2016, 20:21 16
Цитата Сообщение от fire_Rising Посмотреть сообщение
посмотреть урок Дениса Маркова
Денис, Вы раскрыты.
Во всяком случае, врядли еще кто-то будет эти уроки советовать,
разве что в качестве вредного совета.
0
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
30.07.2016, 20:33  [ТС] 17
Croessmah,
Цитата Сообщение от Croessmah Посмотреть сообщение
Денис, Вы раскрыты.
Во всяком случае, врядли еще кто-то будет эти уроки советовать,
разве что в качестве вредного совета.
А что с ними не так ? я Посматривал некоторые темы, доходчиво объясняет...
0
Croessmah
30.07.2016, 20:40
  #18

Не по теме:

Цитата Сообщение от kiwokr Посмотреть сообщение
Посматривал некоторые темы
Я тоже, этого хватило для оценки.
Глупости говорит и пишет слишком часто.

P.S. и не спрашивайте какие именно, лезть и заново смотреть я не собираюсь.

0
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
30.07.2016, 20:55  [ТС] 19
Croessmah, а может есть в памяти более хорошие видео уроки ?
P.S как ставить тэг "не по теме" ?
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
30.07.2016, 20:59 20

Не по теме:

Цитата Сообщение от kiwokr Посмотреть сообщение
а может есть в памяти более хорошие видео уроки ?
Более хорошие - есть, но хороших - нет :)


Цитата Сообщение от kiwokr Посмотреть сообщение
P.S как ставить тэг "не по теме" ?
Выделить текст и нажать кнопочку "OFF".
Ну или вручную данный тег прописать.
[OFF]текст[/OFF]
выглядит так:

Не по теме:

текст

0
30.07.2016, 20:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2016, 20:59

Заменить массив структур на односвязный список, и на двусвязный список
Взять текст задания и заменить массив структур на односвязный список, и на...

Создать двусвязный список групп факультета, где каждая группа представляет собой односвязный список студентов
Задание: создайте двусвязный список групп факультета. Каждая группа...

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


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

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

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