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

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

Войти
Регистрация
Восстановить пароль
 
gunslinger17
0 / 0 / 0
Регистрация: 25.02.2012
Сообщений: 80
#1

Ошибка 0xC0000005 при работе с двухсвязным списком - C++

05.11.2012, 20:01. Просмотров 533. Ответов 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
using namespace std;
struct tree 
{
    int info;
    tree *right;
    tree *left;
};
tree *root=NULL;
int count=0;
void tree_create(tree **current, int n, int massive [13], int mcounter)
{
    if(n==0)
        *current=NULL;
    else
    {
        int n_left=n/2;
        int n_right=n-n_left-1;
    tree *tmp=new tree;
    tmp->info=massive[mcounter];
    count++;
    if(massive[mcounter+1]>massive[mcounter])
    {
        tree_create(&tmp->right, n_right, massive, mcounter+1);
        *current=tmp;
    }
    else
    {
            tree_create(&tmp->left, n_left, massive, mcounter+1);
        *current=tmp;
    }
     }
}
void showsymmetric(tree *current,int l)
{
    if(current!=NULL)
    {
        showsymmetric(current->left,l+1);
        for(int i=0;i<l;i++)
            cout << "\t";
        cout << current->info << endl;
        showsymmetric(current->right,l+1);        
    }
}
 
void cleartree(tree **current)
{
    if(*current!=NULL)
    {
        cleartree(&(*current)->left);
        cleartree(&(*current)->right);
        delete *current;
        count--;
        if(count==0)
            *current=NULL;
    }
}
 
int main()
{
cleartree(&root);
int massive [13] = {5, 9, 13, 14, 2, 7, 1, 15, 18, 8, 4, 3, 50};
tree_create(&root,13,massive,0);
showsymmetric(root,0);
cleartree(&root);
getch();
return 0;
}
Вылезает ошибка со скриншота
Миниатюры
Ошибка 0xC0000005 при работе с двухсвязным списком  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2012, 20:01     Ошибка 0xC0000005 при работе с двухсвязным списком
Посмотрите здесь:

Ошибка при работе со структурой C++
Задача с односвязным и двухсвязным списком (сортировка). C++
Ошибка при работе с мютексом C++
Ошибка при работе со строками C++
Возникает ошибка "0xC0000005: Нарушение прав доступа при чтении "0xfeeefee2"." C++
Ошибка при работе со списком: необъявленный идентификатор C++
Ошибка при работе деструктора C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kertio
26 / 26 / 1
Регистрация: 20.09.2011
Сообщений: 68
05.11.2012, 20:55     Ошибка 0xC0000005 при работе с двухсвязным списком #2
Потому что проходишь три элемента, и далее указателям присваивается null.
C++
1
2
int n_left=n/2;
int n_right=n-n_left-1;
Не понял этого?
И выход за границы проверь. при mcount=12 выход за границы.
gunslinger17
0 / 0 / 0
Регистрация: 25.02.2012
Сообщений: 80
05.11.2012, 21:31  [ТС]     Ошибка 0xC0000005 при работе с двухсвязным списком #3
Цитата Сообщение от kertio Посмотреть сообщение
Потому что проходишь три элемента, и далее указателям присваивается null.
C++
1
2
int n_left=n/2;
int n_right=n-n_left-1;
Не понял этого?
Код не мой... Перемастрячил под свои нужды.
Как я понял, это количество элементов (вершин), которые будут идти справа и слева.
Цитата Сообщение от kertio Посмотреть сообщение
И выход за границы проверь. при mcount=12 выход за границы.
Добавить что-то вроде if(mcounter<=13)? Если да, то куда? После count++?
kertio
26 / 26 / 1
Регистрация: 20.09.2011
Сообщений: 68
05.11.2012, 21:49     Ошибка 0xC0000005 при работе с двухсвязным списком #4
я так подправил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void tree_create(tree **current, int n, int massive[13], int mcounter) {
    if (n == 0 || mcounter + 1 >= n)
        *current = NULL;
    else {
        int n_left = n;
        int n_right = n;
        //int n_left = n / 2;
        //int n_right = n - n_left - 1;
        tree *tmp = new tree;
        tmp->info = massive[mcounter];
        count++;
        if (massive[mcounter + 1] > massive[mcounter]) {
            tree_create(&tmp->right, n_right, massive, mcounter + 1);
            *current = tmp;
        } else {
            tree_create(&tmp->left, n_left, massive, mcounter + 1);
            *current = tmp;
        }
    }
}
Добавлено через 59 секунд
вариант незаконченный, сразу предупреждаю, так, чуток побаловался, просто времени в обрез. отлаживать нужно.

Добавлено через 1 минуту
во всяком случае в таком варианте выводятся все элементы.
gunslinger17
0 / 0 / 0
Регистрация: 25.02.2012
Сообщений: 80
05.11.2012, 21:58  [ТС]     Ошибка 0xC0000005 при работе с двухсвязным списком #5
Цитата Сообщение от kertio Посмотреть сообщение
я так подправил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void tree_create(tree **current, int n, int massive[13], int mcounter) {
    if (n == 0 || mcounter + 1 >= n)
        *current = NULL;
    else {
        int n_left = n;
        int n_right = n;
        //int n_left = n / 2;
        //int n_right = n - n_left - 1;
        tree *tmp = new tree;
        tmp->info = massive[mcounter];
        count++;
        if (massive[mcounter + 1] > massive[mcounter]) {
            tree_create(&tmp->right, n_right, massive, mcounter + 1);
            *current = tmp;
        } else {
            tree_create(&tmp->left, n_left, massive, mcounter + 1);
            *current = tmp;
        }
    }
}
Добавлено через 59 секунд
вариант незаконченный, сразу предупреждаю, так, чуток побаловался, просто времени в обрез. отлаживать нужно.

Добавлено через 1 минуту
во всяком случае в таком варианте выводятся все элементы.
та же ошибка выскакивает О_о
kazak
3031 / 2352 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
05.11.2012, 22:19     Ошибка 0xC0000005 при работе с двухсвязным списком #6
Вообще лучше инициализировать указатели листа сразу при создании.

Цитата Сообщение от gunslinger17 Посмотреть сообщение
C++
1
2
tmp->info=massive[mcounter];
 count++;
C++
1
2
3
4
tmp->info=massive[mcounter];
tmp->left = NULL;
tmp->right = NULL;
count++;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2012, 17:10     Ошибка 0xC0000005 при работе с двухсвязным списком
Еще ссылки по теме:

C++ Ошибка 0xC0000005: Нарушение прав доступа при чтении "0xcccccccc"
Ошибка при работе со списком: "Сбой при преобразовании в COFF: Файл недопустим или поврежден" C++
Ошибка при инициализации вектора списком C++
C++ Нужны задачки для упражнения в работе со списком, стеком, очередью и двусвязным списком
Работа с линейным односвязным (двухсвязным) списком C++

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

Или воспользуйтесь поиском по форуму:
gunslinger17
0 / 0 / 0
Регистрация: 25.02.2012
Сообщений: 80
06.11.2012, 17:10  [ТС]     Ошибка 0xC0000005 при работе с двухсвязным списком #7
Цитата Сообщение от kazak Посмотреть сообщение
Вообще лучше инициализировать указатели листа сразу при создании.
C++
1
2
3
4
tmp->info=massive[mcounter];
tmp->left = NULL;
tmp->right = NULL;
count++;
Огроменное спасибо) Все заработало)
Но дерево почему-то выводится вот так. Как-нибудь поразборчивее сделать можно?
Миниатюры
Ошибка 0xC0000005 при работе с двухсвязным списком  
Yandex
Объявления
06.11.2012, 17:10     Ошибка 0xC0000005 при работе с двухсвязным списком
Ответ Создать тему
Опции темы

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