Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
#1

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

29.07.2016, 13:00. Просмотров 449. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Односвязный список. Крэш программы при выводе (C++):

Крэш программы при работе с кострукторами - C++
Пробую разобраться с конструкторами. Увы пока крэш ( Подскажите #define _CRT_SECURE_NO_WARNINGS #include&lt;iostream&gt; #include&lt;cstring&gt; ...

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

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

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

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

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

23
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
29.07.2016, 13:04  [ТС] #2
хех пока просматривал пост, заметил ошибку. Но остался другой косяк. Есть какой-то не инициализированный список.
0
Миниатюры
Односвязный список. Крэш программы при выводе  
fire_Rising
10 / 11 / 2
Регистрация: 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 / 2
Регистрация: 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
Ушел
13782 / 8032 / 928
Регистрация: 27.09.2012
Сообщений: 19,798
Записей в блоге: 3
Завершенные тесты: 1
29.07.2016, 13:14 #6
Цитата Сообщение от kiwokr Посмотреть сообщение
Извиняюсь за повторную тему (вчера такую же создавал с другим вопросом, но не смог найти её )
В верхнем правом углу страницы есть ссылка "Мои темы".

И да, один вопрос - одна тема.
1
fire_Rising
10 / 11 / 2
Регистрация: 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 / 2
Регистрация: 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 / 2
Регистрация: 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
30.07.2016, 20:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2016, 20:17
Привет! Вот еще темы с ответами:

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

Односвязный список - C++
Во общем, программа создает список и заносит туда элементы с помощью массива. Но при выводе, программа выводит лишний элемент первым. Где...

Односвязный список. - C++
Привет -_- В моем понимании односвязный список это типо прямоугольнички, состоящие из двух - в одном из них типо содержание...

Односвязный список - C++
Дан список целых чисел , удалить все положительные. struct my_list{ int num; struct my_list*Next; } int x; my_list...


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

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

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