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

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

Войти
Регистрация
Восстановить пароль
 
Fene4ka_
89 / 89 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
#1

Указатели у стеков на голову и следующий элемент всегда Unable to read memory - C++

10.05.2014, 20:23. Просмотров 678. Ответов 6
Метки нет (Все метки)

написал программу, которая информацию из бинарного дерева записывает в 2 стека, но почему-то указатели у стеков на голову и следующий элемент всегда Unable to read memory ...
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include "stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
//Наша структура
struct node
{
    string info; //Информационное поле
    node *l, *r;//Левая и Правая часть дерева
};
 
node * tree = NULL; //Объявляем переменную, тип которой структура Дерево
 
struct List4et
{
    string x; //информационный элемент
    List4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В СТЕК  (в список LIFO)*/
void AddInList4et(List4et **MyList, node *t, int u) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
    int Summ = 0;
    List4et *temp = new List4et; //Выделяем память для нового элемента
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        AddInList4et(&temp, t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i < u; ++i)
        {
            for (int z = 0; z < t->info.size(); z++)
                Summ += t->info[z];
            if (Summ % 2 == 0)
            {
                temp->x = t->info; //Записываем в поле x принимаемый в функцию элемент x
                temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
                (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
            }
        }
        u--;
    }
    AddInList4et(&temp, t->l, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ СТЕКА*/
void ShowList4et(List4et *MyList) //Нужен только сам стек
{
    List4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
    //с помощью цикла проходим по всему стеку
    while (temp != NULL)  //выходим при встрече с пустым полем
    {
        cout << temp->x << " "; //Выводим на экран элемент стека
        temp = temp->Next; //Переходим к следующему элементу
    }
}
 
struct ListNe4et
{
    string x; //информационный элемент
    ListNe4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В СТЕК  (в список LIFO)*/
void AddInListNe4et(ListNe4et **MyList, node *t, int u) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
    int Summ = 0;
    ListNe4et *temp = new ListNe4et; //Выделяем память для нового элемента
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        AddInListNe4et(&temp, t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i < u; ++i)
        {
            for (int z = 0; z < t->info.size(); z++)
                Summ += t->info[z];
            if (Summ % 2 != 0)
            {
                temp->x = t->info; //Записываем в поле x принимаемый в функцию элемент x
                temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
                (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
            }
        }
        u--;
    }
    AddInListNe4et(&temp, t->l, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ СТЕКА*/
void ShowListNe4et(ListNe4et *MyList) //Нужен только сам стек
{
    ListNe4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
    //с помощью цикла проходим по всему стеку
    while (temp != NULL)  //выходим при встрече с пустым полем
    {
        cout << temp->x << " "; //Выводим на экран элемент стека
        temp = temp->Next; //Переходим к следующему элементу
    }
}
 
/*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
void pushInTree(string a, node **t)
{
    if ((*t) == NULL) //Если дерева не существует
    {
        (*t) = new node; //Выделяем память
        (*t)->info = a; //Кладем в выделенное место аргумент a
        (*t)->l = (*t)->r = NULL; //Очищаем память для следующего роста
        return; //Заложили семечко, выходим
    }
    //Дерево есть
    if (a>(*t)->info) pushInTree(a, &(*t)->r); //Если аргумент а больше чем текущий элемент, кладем его вправо
    else pushInTree(a, &(*t)->l); //Иначе кладем его влево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
void printTree(node *t, int u)
{
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        printTree(t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i<u; ++i) cout << "|";
        cout << t->info << endl; //И показываем элемент
        u--;
    }
    printTree(t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    string word;
    cout << "Write Words : ";
    while (cin >> word)
        pushInTree(word, &tree);
    cout << "Your tree\n";
    printTree(tree, 0);
    List4et *MyList4et = new List4et; //Выделяем память для стека
    MyList4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
    ListNe4et *MyListNe4et = new ListNe4et; //Выделяем память для стека
    MyListNe4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
    AddInList4et(&MyList4et, tree, 0);
    AddInListNe4et(&MyListNe4et, tree, 0);
    ShowList4et(MyList4et);
    cout << endl;
    ShowListNe4et(MyListNe4et);
    cout << endl;
    system("pause");
    return 0;
}
Добавлено через 3 часа 16 минут
upup

Добавлено через 2 часа 59 минут
upup
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2014, 20:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели у стеков на голову и следующий элемент всегда Unable to read memory (C++):

Unable to read memory - C++
Явных ошибок нет, а в чем проблема понять не могу. Буду премного благодарен за разъяснение.

Динамически струтуры данных. Даны указатели P1 и P2 на вершины двух непустых стеков... - C++
Даны указатели P1 и P2 на вершины двух непустых стеков. Пе- ремещать элементы из первого стека во второй, пока значение вершины первого...

Ошибка gdb: unable to read jit descriptor from remote memory - Lazarus
При попытке запустить проект OpenGLControl_Demo получаю ошибку gdb: unable to read jit descriptor from remote memory. В проекте Hello...

a disk read error occurred помогите!!!голову сломал уже - Ноутбуки
как мне объяснили переустановили винду через 2 недели такая хрень при запуске биос грузится версия ф 12 винду сменить не могу биос...

Ошибка времени выполнения unable to read beyond the end of stream - Pascal ABC
uses graphabc; var a, b, c:integer; i:file of integer; begin SetWindowWidth(500); SetWindowHeight(500); ...

InternetReadFile который не всегда Read - C++ WinAPI
hSession = InternetOpenA( &quot;Microsoft Internet Explorer&quot;, // agent INTERNET_OPEN_TYPE_PRECONFIG, // access NULL, NULL, 0); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
10.05.2014, 21:11 #2
Я попробую Вам помочь, но для этого мне нужно Ваше содействие. Для начала - очень здорово когда программа является кросс-платформенной, например я компилирую Ваш код в Linux - и средства (притом не обязательные) из windows - мне мешают. Я внёс незначительные изменения в Ваш код. Вот он :
Кликните здесь для просмотра всего текста
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <iostream>
#include <string>
 
using namespace std;
 
//Наша структура
struct node
{
  string info; //Информационное поле
  node *l, *r;//Левая и Правая часть дерева
};
 
node * tree = NULL; //Объявляем переменную, тип которой структура Дерево
 
struct List4et
{
  string x; //информационный элемент
  List4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В СТЕК  (в список LIFO)*/
void AddInList4et(List4et **MyList, node *t, int u) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
  int Summ = 0;
  List4et *temp = new List4et; //Выделяем память для нового элемента
  if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
  else //Иначе
    {
      AddInList4et(&temp, t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
      for (int i = 0; i < u; ++i)
        {
          for (int z = 0; z < t->info.size(); z++)
            Summ += t->info[z];
          if (Summ % 2 == 0)
            {
              temp->x = t->info; //Записываем в поле x принимаемый в функцию элемент x
              temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
              (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
            }
        }
      u--;
    }
  AddInList4et(&temp, t->l, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ СТЕКА*/
void ShowList4et(List4et *MyList) {
  List4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
  //с помощью цикла проходим по всему стеку
  while (temp != NULL)  //выходим при встрече с пустым полем
    {
      cout << temp->x << " "; //Выводим на экран элемент стека
      temp = temp->Next; //Переходим к следующему элементу
    }
}
 
struct ListNe4et
{
  string x; //информационный элемент
  ListNe4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В СТЕК  (в список LIFO)*/
void AddInListNe4et(ListNe4et **MyList, node *t, int u) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
  int Summ = 0;
  ListNe4et *temp = new ListNe4et; //Выделяем память для нового элемента
  if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
  else //Иначе
    {
      AddInListNe4et(&temp, t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
      for (int i = 0; i < u; ++i)
        {
          for (int z = 0; z < t->info.size(); z++)
            Summ += t->info[z];
          if (Summ % 2 != 0)
            {
              temp->x = t->info; //Записываем в поле x принимаемый в функцию элемент x
              temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
              (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
            }
        }
      u--;
    }
  AddInListNe4et(&temp, t->l, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ СТЕКА*/
void ShowListNe4et(ListNe4et *MyList) //Нужен только сам стек
{
  ListNe4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
  //с помощью цикла проходим по всему стеку
  while (temp != NULL)  //выходим при встрече с пустым полем
    {
      cout << temp->x << " "; //Выводим на экран элемент стека
      temp = temp->Next; //Переходим к следующему элементу
    }
}
 
/*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
void pushInTree(string a, node **t)
{
  if ((*t) == NULL) //Если дерева не существует
    {
      (*t) = new node; //Выделяем память
      (*t)->info = a; //Кладем в выделенное место аргумент a
      (*t)->l = (*t)->r = NULL; //Очищаем память для следующего роста
      return; //Заложили семечко, выходим
    }
  //Дерево есть
  if (a>(*t)->info) pushInTree(a, &(*t)->r); //Если аргумент а больше чем текущий элемент, кладем его вправо
  else pushInTree(a, &(*t)->l); //Иначе кладем его влево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
void printTree(node *t, int u)
{
  if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
  else //Иначе
    {
      printTree(t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
      for (int i = 0; i<u; ++i) cout << "|";
      cout << t->info << endl; //И показываем элемент
      u--;
    }
  printTree(t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
int main(int argc, char *argv[]) {
  string word;
  cout << "Write Words : ";
  for (int i = 0; i < 10; ++i) {
      cin >> word;
      pushInTree(word, &tree);
    }
  cout << "Your tree\n";
  printTree(tree, 0);
  List4et *MyList4et = new List4et; //Выделяем память для стека
  MyList4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
  ListNe4et *MyListNe4et = new ListNe4et; //Выделяем память для стека
  MyListNe4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
  AddInList4et(&MyList4et, tree, 0);
  AddInListNe4et(&MyListNe4et, tree, 0);
  ShowList4et(MyList4et);
  cout << endl;
  ShowListNe4et(MyListNe4et);
  cout << endl;
  return 0;
}


Во-первых, вопрос - какое поведение Вы ожидаете от программы? Я вижу сейчас выведение дерева на экран и всё. Кроме того как предполагалось останавливать ввод слов из консоли? Я ограничил сейчас 10-ю словами, потому-что не мог остановить ввод слов.

Добавлено через 31 минуту
Из того, что удалось заметить Строка:
C++
1
      AddInList4et(&temp, t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
Идентична строке:
C++
1
  AddInList4et(&temp, t->l, ++u); //С помощью рекурсии посещаем правое поддерево
Хотя исходя из комментариев - нужно передавать разный указатель на правое и левое поддерево от t.
Fene4ka_
89 / 89 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
10.05.2014, 22:30  [ТС] #3
Melg,
C++
1
AddInList4et(&temp, t->l, ++u); //С помощью рекурсии посещаем правое поддерево
с этим косяк, согласен, поправил ...
программа должна записать в один стек слова из дерева, с четной суммой кодов символов, а в другое с нечетной, но почему-то память под голову стека не выделяется
C++
1
MyList4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
10.05.2014, 22:36 #4
Из того, что я вижу, например в функции
C++
1
void AddInList4et(List4et **MyList, node *t, int u) {
Указатель не будет присвоен в HEAD в случае когда условие не выполняется :
C++
1
2
3
4
5
6
          if (Summ % 2 == 0)
            {
              temp->x = t->info; //Записываем в поле x принимаемый в функцию элемент x
              temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
              (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
            }
Т.е Вы выделили память, передали указатель в рекурсивный вызов, но для текущего элемента MyList - ему не выставили head, верно ли это?
Fene4ka_
89 / 89 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
11.05.2014, 00:10  [ТС] #5
Melg, ведь если условие не выполнится, то изменится только состояния дерева ...
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
11.05.2014, 00:20 #6
Я предлагаю поступить следующим образом: Вы измените код таким образом, чтобы Ваше дерево автоматически заполнялось некоторой последовательностью (а не как сейчас с клавиатуры). Далее - Вы скажите какой ожидается набор для двух заданных листов (т.е. как они должны заполниться из дерева) и что у Вас получилось на самом деле. Исходя из набора таких данных, возможно, мне удастся Вам помочь.
Fene4ka_
89 / 89 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
13.05.2014, 04:04  [ТС] #7
Melg, для прекращения ввода слов можно просто перейти на новую строку и нажать ctrl+Z, затем ентерMelg,
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdlib.h>
 
using namespace std;
 
//Наша структура
struct node
{
    string info; //Информационное поле
    node *l, *r;//Левая и Правая часть дерева
};
 
node * tree = NULL; //Объявляем переменную, тип которой структура Дерево
 
struct List4et
{
    string x; //информационный элемент
    List4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В ЧЕТНЫЙ СТЕК  (в список LIFO)*/
void AddInList4et(List4et **MyList, node *t, int u) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
    List4et *temp = new List4et; //Выделяем память для нового элемента
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        AddInList4et(&temp, t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i < u; ++i)
        {
            if (t->info[0] % 2 == 0)
            {
                temp->x = t->info; //Записываем в поле x принимаемый в функцию элемент x
                temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
                (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
            }
        }
        u--;
    }
    AddInList4et(&temp, t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ ЧЕТНОГО СТЕКА*/
void ShowList4et(List4et *MyList) //Нужен только сам стек
{
    List4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
    //с помощью цикла проходим по всему стеку
    while (temp != NULL)  //выходим при встрече с пустым полем
    {
        cout << temp->x << " "; //Выводим на экран элемент стека
        temp = temp->Next; //Переходим к следующему элементу
    }
}
 
struct ListNe4et
{
    string x; //информационный элемент
    ListNe4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В НЕЧЕТНЫЙ СТЕК  (в список LIFO)*/
void AddInListNe4et(ListNe4et **MyList, node *t, int u) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
    ListNe4et *temp = new ListNe4et; //Выделяем память для нового элемента
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        AddInListNe4et(&temp, t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i < u; ++i)
        {
            if (t->info[0] % 2 != 0)
            {
                temp->x = t->info; //Записываем в поле x принимаемый в функцию элемент x
                temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
                (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
            }
        }
        u--;
    }
    AddInListNe4et(&temp, t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ НЕЧЕТНОГО СТЕКА*/
void ShowListNe4et(ListNe4et *MyList) //Нужен только сам стек
{
    ListNe4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
    //с помощью цикла проходим по всему стеку
    while (temp != NULL)  //выходим при встрече с пустым полем
    {
        cout << temp->x << " "; //Выводим на экран элемент стека
        temp = temp->Next; //Переходим к следующему элементу
    }
}
 
/*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
void pushInTree(string a, node **t)
{
    if ((*t) == NULL) //Если дерева не существует
    {
        (*t) = new node; //Выделяем память
        (*t)->info = a; //Кладем в выделенное место аргумент a
        (*t)->l = (*t)->r = NULL; //Очищаем память для следующего роста
        return; //Заложили семечко, выходим
    }
    //Дерево есть
    if (a>(*t)->info) pushInTree(a, &(*t)->r); //Если аргумент а больше чем текущий элемент, кладем его вправо
    else pushInTree(a, &(*t)->l); //Иначе кладем его влево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
void printTree(node *t, int u)
{
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        printTree(t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i<u; ++i) cout << "|";
        cout << t->info << endl; //И показываем элемент
        u--;
    }
    printTree(t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    for (int i = 0; i < 10; i++)
    {
        char buf;
        pushInTree(_itoa(i, &buf, 10), &tree);
    }
    cout << "Your tree\n";
    printTree(tree, 0);
    List4et *MyList4et = new List4et; //Выделяем память для стека
    MyList4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
    ListNe4et *MyListNe4et = new ListNe4et; //Выделяем память для стека
    MyListNe4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
    AddInList4et(&MyList4et, tree, 0);
    AddInListNe4et(&MyListNe4et, tree, 0);
    ShowList4et(MyList4et);
    cout << endl;
    ShowListNe4et(MyListNe4et);
    cout << endl;
    system("pause");
    return 0;
}
изменил код, 1 стек должен вывести четные, другой нечетные

Добавлено через 5 минут
однако элементы в стек не добавляются

Добавлено через 14 часов 22 минуты
upup

Добавлено через 5 минут
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdlib.h>
 
using namespace std;
 
//Наша структура
struct node
{
    string info; //Информационное поле
    node *l, *r;//Левая и Правая часть дерева
};
 
node * tree = NULL; //Объявляем переменную, тип которой структура Дерево
 
struct List4et
{
    string x; //информационный элемент
    List4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В ЧЕТНЫЙ СТЕК  (в список LIFO)*/
void AddInList4et(List4et **MyList, node *t, int u) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
    List4et *temp = new List4et; //Выделяем память для нового элемента
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        AddInList4et(&temp, t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        if (t->info[0] % 2 == 0)
            {
                temp->x = t->info; //Записываем в поле x принимаемый в функцию элемент x
                temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
                (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
            }
        u--;
    }
    AddInList4et(&temp, t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ ЧЕТНОГО СТЕКА*/
void ShowList4et(List4et *MyList) //Нужен только сам стек
{
    List4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
    //с помощью цикла проходим по всему стеку
    while (temp != NULL)  //выходим при встрече с пустым полем
    {
        cout << temp->x << " "; //Выводим на экран элемент стека
        temp = temp->Next; //Переходим к следующему элементу
    }
}
 
struct ListNe4et
{
    string x; //информационный элемент
    ListNe4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В НЕЧЕТНЫЙ СТЕК  (в список LIFO)*/
void AddInListNe4et(ListNe4et **MyList, node *t, int u) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
    ListNe4et *temp = new ListNe4et; //Выделяем память для нового элемента
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        AddInListNe4et(&temp, t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        if (t->info[0] % 2 != 0)
            {
                temp->x = t->info; //Записываем в поле x принимаемый в функцию элемент x
                temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
                (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
            }
        u--;
    }
    AddInListNe4et(&temp, t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ НЕЧЕТНОГО СТЕКА*/
void ShowListNe4et(ListNe4et *MyList) //Нужен только сам стек
{
    ListNe4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
    //с помощью цикла проходим по всему стеку
    while (temp != NULL)  //выходим при встрече с пустым полем
    {
        cout << temp->x << " "; //Выводим на экран элемент стека
        temp = temp->Next; //Переходим к следующему элементу
    }
}
 
/*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
void pushInTree(string a, node **t)
{
    if ((*t) == NULL) //Если дерева не существует
    {
        (*t) = new node; //Выделяем память
        (*t)->info = a; //Кладем в выделенное место аргумент a
        (*t)->l = (*t)->r = NULL; //Очищаем память для следующего роста
        return; //Заложили семечко, выходим
    }
    //Дерево есть
    if (a>(*t)->info) pushInTree(a, &(*t)->r); //Если аргумент а больше чем текущий элемент, кладем его вправо
    else pushInTree(a, &(*t)->l); //Иначе кладем его влево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
void printTree(node *t, int u)
{
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        printTree(t->l, ++u);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i<u; ++i) cout << "|";
        cout << t->info << endl; //И показываем элемент
        u--;
    }
    printTree(t->r, ++u); //С помощью рекурсии посещаем правое поддерево
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    for (int i = 0; i < 10; i++)
    {
        char buf[256];
        pushInTree(_itoa(i, buf, 10), &tree);
    }
    cout << "Your tree\n";
    printTree(tree, 0);
    List4et *MyList4et = new List4et; //Выделяем память для стека
    MyList4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
    ListNe4et *MyListNe4et = new ListNe4et; //Выделяем память для стека
    MyListNe4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
    AddInList4et(&MyList4et, tree, 0);
    AddInListNe4et(&MyListNe4et, tree, 0);
    ShowList4et(MyList4et);
    cout << endl;
    ShowListNe4et(MyListNe4et);
    cout << endl;
    system("pause");
    return 0;
}
код еще изменился, но проблема осталась

Добавлено через 3 часа 2 минуты
upup

Добавлено через 1 час 33 минуты
upup

Добавлено через 5 часов 56 минут
эх, может все-таки кто-нибудь знает в чем причина ?

Добавлено через 10 часов 28 минут
Upup

Добавлено через 4 часа 2 минуты
апап

Добавлено через 11 часов 45 минут
в общем я сам решил проблему
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Задача1.cpp : Defines the entry point for the console application.
/* В узлах бинарного дерева расположены строки. Создать стек и
поместить в него все строки, содержащиеся в листьях дерева и
имеющие четную сумму кодов символов. */
 
#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdlib.h>
 
using namespace std;
 
//Наша структура
struct node
{
    string info; //Информационное поле
    node *l, *r;//Левая и Правая часть дерева
};
 
node * tree = NULL; //Объявляем переменную, тип которой структура Дерево
 
struct List4et
{
    string x; //информационный элемент
    List4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В ЧЕТНЫЙ СТЕК  (в список LIFO)*/
void AddInList4et(string x, List4et **MyList) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
    List4et *temp = new List4et; //Выделяем память для нового элемента
    temp->x = x; //Записываем в поле x принимаемый в функцию элемент x
    temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
    (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ ЧЕТНОГО СТЕКА*/
void ShowList4et(List4et *MyList) //Нужен только сам стек
{
    List4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
    //с помощью цикла проходим по всему стеку
    while (temp != NULL)  //выходим при встрече с пустым полем
    {
        cout << temp->x << " "; //Выводим на экран элемент стека
        temp = temp->Next; //Переходим к следующему элементу
    }
}
 
struct ListNe4et
{
    string x; //информационный элемент
    ListNe4et *Next, *Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В НЕЧЕТНЫЙ СТЕК  (в список LIFO)*/
void AddInListNe4et(string x, ListNe4et **MyList) //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
{
    ListNe4et *temp = new ListNe4et; //Выделяем память для нового элемента
    temp->x = x; //Записываем в поле x принимаемый в функцию элемент x
    temp->Next = (*MyList)->Head; //Указываем, что следующий элемент это предыдущий
    (*MyList)->Head = temp; //Сдвигаем голову на позицию вперед
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ НЕЧЕТНОГО СТЕКА*/
void ShowListNe4et(ListNe4et *MyList) //Нужен только сам стек
{
    ListNe4et *temp = MyList->Head; //Объявляем указатель и Указываем ему, что его позиция в голове стека
    //с помощью цикла проходим по всему стеку
    while (temp != NULL)  //выходим при встрече с пустым полем
    {
        cout << temp->x << " "; //Выводим на экран элемент стека
        temp = temp->Next; //Переходим к следующему элементу
    }
}
 
/*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
void pushInTree(string a, node **t)
{
    if ((*t) == NULL) //Если дерева не существует
    {
        (*t) = new node; //Выделяем память
        (*t)->info = a; //Кладем в выделенное место аргумент a
        (*t)->l = (*t)->r = NULL; //Очищаем память для следующего роста
        return; //Заложили семечко, выходим
    }
    //Дерево есть
    if (a>(*t)->info) pushInTree(a, &(*t)->r); //Если аргумент а больше чем текущий элемент, кладем его вправо
    else pushInTree(a, &(*t)->l); //Иначе кладем его влево
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
void printTree(node *t, int u, ListNe4et **MyListNe, List4et **MyList)
{   
    if (t == NULL) return; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        printTree(t->l, ++u, MyListNe, MyList);//С помощью рекурсивного посещаем левое поддерево
        for (int i = 0; i<u; ++i) cout << "|";
        cout << t->info << endl; //И показываем элемент
        int Summ = 0;
        for (int i = 0; i < t->info.size(); i++)
            Summ += t->info[i];
        if (Summ % 2 == 0)
            AddInList4et(t->info, MyList);
        else
            AddInListNe4et(t->info, MyListNe);
        u--;
    }
    printTree(t->r, ++u, MyListNe, MyList); //С помощью рекурсии посещаем правое поддерево
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Write words : ";
    char word[256];
    while (cin.getline(word, 256))
        pushInTree(word, &tree);
    List4et *MyList4et = new List4et; //Выделяем память для стека
    MyList4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
    ListNe4et *MyListNe4et = new ListNe4et; //Выделяем память для стека
    MyListNe4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
    cout << "Your tree\n";
    printTree(tree, 0, &MyListNe4et, &MyList4et);
    ShowList4et(MyList4et);
    cout << endl;
    ShowListNe4et(MyListNe4et);
    cout << endl;
    system("pause");
    return 0;
}
а вот задание, которое было
Кликните здесь для просмотра всего текста
В узлах бинарного дерева расположены строки. Создать стек и
поместить в него все строки, содержащиеся в листьях дерева и
имеющие четную сумму кодов символов
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2014, 04:04
Привет! Вот еще темы с ответами:

При обращении к функции из dll ошибка attempted to read or write protected memory - C++/CLI
После создание контекста опенгл, пробую использовать функции из расширения glew. И вот при обращении и C# в длл на c++/cli появляеться...

The memory could not be "read" \ "write"; Read\WriteProcessMemory - C#
Добрый день. Вечная проблема при попытке прочитать \ записать в память, при помощи Read\WriteProcessMemory - это ошибки The memory could...

Ошибка Additional information: Attempted to read or write protected memory при вызове OpenFileDialog - C#
При 6 визове OpenFileDialog. То что видает. A first chance exception of type 'System.AccessViolationException' occurred in...

Программа по генерации 7-значного номера время от времени (не всегда) падает с ошибкой memory violation - C (СИ)
Добрый день. моя программа по генерации 7-значного номера время от времени (не всегда) падает с ошибкой memory violation : Exception...


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

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

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