Форум программистов, компьютерный форум CyberForum.ru

Cоздать класс-шаблон, реализующий односвязный список - C++

Восстановить пароль Регистрация
 
Юрий4995
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 7
01.08.2013, 12:02     Cоздать класс-шаблон, реализующий односвязный список #1
Помогите новичку, пожалуйста, с такой задачей: необходимо создать класс-шаблон, реализующий односвязный список, а потом проверить его с целочисленными и числовыми с плавающей запятой значениями. Ниже код, он компилируется и запускается без проблем, но после запуска выдает ошибку: "Необработанное исключение по адресу 0x010A4349 в 10three.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFEEEFEF2."
Помогите найти ошибку в коде. Заранее спасибо!
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
#include <iostream>
#include <cstring>
#include <cctype>
#include <cmath>
 
using namespace std;
 
template <class T>
struct link
{
    T data;
    link *next;
};
 
template <class T>
class list
{
private:
    link<T> *first;
public:
    list()
    {
        first = NULL;
    }
    ~list()
    {
        while (first!=NULL)  //Пока по адресу не пусто 
        {    
            link<T> *temp = first->next; //Временная переменная для хранения адреса следующего элемента
            delete first; //Освобождаем адрес обозначающий начало
            first = temp; //Меняем адрес на следующий
        }
    };
 
    void add_item_after(link<T> *p, T d)
    {
        link<T> *temp = new link<T>;
        temp->data = d;
        temp->next = p->next;
        p->next = temp;
        delete temp;
    }
    void add_item_last(T d)
    {
        link<T> *q = first;
 
        if(first == NULL)
        {
            link<T> *temp = new link<T>;
 
            temp->data = d;
            temp->next = first;
            first = temp;
            delete temp;
            return;
        }
        while(q->next)
            q = q->next;
        add_item_after(q, d);
        delete q;
    }
    void show()
    {
        link<T> *current = first;
 
        cout << "Элементы, списка:" << endl;
        while(current != NULL)
        {
            cout << current->data << endl;
            current = current->next;
        }
        delete current;
    }
};
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    list <int> li;
    li.add_item_last(45);
    li.add_item_last(0);
    li.add_item_last(-33);
    li.add_item_last(55);
    li.add_item_last(-12);
    li.show();
 
    list <float> lf;
    lf.add_item_last(45.89f);
    lf.add_item_last(0.0f);
    lf.add_item_last(-33.33f);
    lf.add_item_last(55.123f);
    lf.add_item_last(-12.0f);
    lf.show();
 
    system("pause");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
01.08.2013, 12:23     Cоздать класс-шаблон, реализующий односвязный список #2
Уберите строки 42, 55 и 61.
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
01.08.2013, 12:23     Cоздать класс-шаблон, реализующий односвязный список #3
Добавь конструктор классу link в котором будеш присваивать нуль next'у
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
01.08.2013, 12:24     Cоздать класс-шаблон, реализующий односвязный список #4
Юрий4995, при добавлении элемента ты освобождаешь память из под temp. Тогда p->next указывает на память, которая была освобождена. Соответсвенно к ней доступа нет, программа будет крешиться в деструкторе при попытке освободить память, а также иногда при записи.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
01.08.2013, 12:25     Cоздать класс-шаблон, реализующий односвязный список #5
А чтобы еще чему-нибудь не удивляться, уберите еще и строку 73 и реализуйте деструктор.
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
01.08.2013, 12:30     Cоздать класс-шаблон, реализующий односвязный список #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    void add_item_last(T d)
{
     link<T> *q = first;
 
     if(first == NULL)
     {
         link<T> *temp = new link<T>;
 
         temp->data = d;
         temp->next = first;
         first = temp;
         delete temp;
         return;
     }
     while(q->next)
         q = q->next;
     add_item_after(q, d);
     delete q;
}
Что-то я ничего не понимаю, у тебя последний элемент ссылается на первый элемент? у тебя при таком раскладе вот этот цикл
C++
1
2
3
4
5
6
while(current != NULL)
{
    cout << current->data << endl;
    current = current->next;
}
delete current;
будет работать бесконечно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2013, 14:43     Cоздать класс-шаблон, реализующий односвязный список
Еще ссылки по теме:

Создать класс-шаблон, реализующий односвязный список C++
C++ Класс Односвязный список
Создать динамический шаблонный класс односвязный список - List C++

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

Или воспользуйтесь поиском по форуму:
Юрий4995
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 7
01.08.2013, 14:43  [ТС]     Cоздать класс-шаблон, реализующий односвязный список #7
Цитата Сообщение от Praktolock Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    void add_item_last(T d)
{
     link<T> *q = first;
 
     if(first == NULL)
     {
         link<T> *temp = new link<T>;
 
         temp->data = d;
         temp->next = first;
         first = temp;
         delete temp;
         return;
     }
     while(q->next)
         q = q->next;
     add_item_after(q, d);
     delete q;
}
Что-то я ничего не понимаю, у тебя последний элемент ссылается на первый элемент? у тебя при таком раскладе вот этот цикл
C++
1
2
3
4
5
6
while(current != NULL)
{
    cout << current->data << endl;
    current = current->next;
}
delete current;
будет работать бесконечно.
Я так понял, вы про эту строчку?
C++
1
temp->next = first;
. Тогда спасибо, я ее исправил на
C++
1
temp->next = NULL;
, а также удалил строки 42, 55, 61 и 73. И у меня все заработало, большое вам всем спасибо. А деструктор у меня есть, и вроде бы, правильно работает:
C++
1
2
3
4
5
6
7
8
9
~list()
    {
        while (first!=NULL)  //Пока по адресу не пусто 
        {    
            link<T> *temp = first->next; //Временная переменная для хранения адреса следующего элемента
            delete first; //Освобождаем адрес обозначающий начало
            first = temp; //Меняем адрес на следующий
        }
    }
Yandex
Объявления
01.08.2013, 14:43     Cоздать класс-шаблон, реализующий односвязный список
Ответ Создать тему
Опции темы

Текущее время: 07:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru