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

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

Войти
Регистрация
Восстановить пароль
 
Юрий4995
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 7
#1

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

01.08.2013, 12:02. Просмотров 1321. Ответов 6
Метки нет (Все метки)

Помогите новичку, пожалуйста, с такой задачей: необходимо создать класс-шаблон, реализующий односвязный список, а потом проверить его с целочисленными и числовыми с плавающей запятой значениями. Ниже код, он компилируется и запускается без проблем, но после запуска выдает ошибку: "Необработанное исключение по адресу 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");
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2013, 12:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Cоздать класс-шаблон, реализующий односвязный список (C++):

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

Шаблон (односвязный список) - C++
Помогите пожалуйста мне в вопросе с односвязным списком. мне нужно реализовать в виде шаблонного класса вычислительную структуру...

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

Класс Односвязный список - C++
Есть класс Односвязный список #include &quot;ListInterface.h&quot; #include &quot;Node.h&quot; //#include &quot;PrecondViolatedExcep.h&quot; template &lt; class...

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

Создать динамический шаблонный класс односвязный список - List - C++
помогите пожалуйста с задание в универ задали и я вот сижу парюсь! буду очень вам благодарен Создать динамический шаблонный класс...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
01.08.2013, 12:23 #2
Уберите строки 42, 55 и 61.
1
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.08.2013, 12:23 #3
Добавь конструктор классу link в котором будеш присваивать нуль next'у
0
nonedark2008
908 / 647 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
01.08.2013, 12:24 #4
Юрий4995, при добавлении элемента ты освобождаешь память из под temp. Тогда p->next указывает на память, которая была освобождена. Соответсвенно к ней доступа нет, программа будет крешиться в деструкторе при попытке освободить память, а также иногда при записи.
1
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
01.08.2013, 12:25 #5
А чтобы еще чему-нибудь не удивляться, уберите еще и строку 73 и реализуйте деструктор.
1
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
01.08.2013, 12:30 #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;
будет работать бесконечно.
1
Юрий4995
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 7
01.08.2013, 14:43  [ТС] #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; //Меняем адрес на следующий
        }
    }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2013, 14:43
Привет! Вот еще темы с ответами:

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон" - C++
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список). При компиляции выдает...

Добавить в класс "Односвязный список" следующие функции - C++
1. Добавить в класс &quot;Односвязный список&quot; следующие функции: вставка элемента в заданную позицию, удаление элемента по заданной позиции,...

list. Cоздать список из результатов(с массивами), а потом просмотреть весь список - C++
Подскажите пожалуйста как мне создать список из моих результатов(с массивами) а потом просмотреть весь список, вот код который имеется ...

Реализовать шаблон класса vector, реализующий динамический массив - C++
Реализовать шаблон класса vector, реализующий динамический массив. Определить 2 объекта класса vector и внешнюю функцию, выполняющую...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2013, 14:43
Ответ Создать тему
Опции темы

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