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

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

Восстановить пароль Регистрация
 
Fene4ka_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
10.05.2014, 20:23     Указатели у стеков на голову и следующий элемент всегда Unable to read memory #1
написал программу, которая информацию из бинарного дерева записывает в 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++
Динамически струтуры данных. Даны указатели P1 и P2 на вершины двух непустых стеков... C++
C++ Делаю Memory Manager Array с простым (int) exception последний элемент чудит
Как в односвязном списке поменять местами один элемент и следующий за ним? C++
Unable to read memory C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Melg
417 / 153 / 62
Регистрация: 23.09.2013
Сообщений: 306
10.05.2014, 21:11     Указатели у стеков на голову и следующий элемент всегда Unable to read memory #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_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
10.05.2014, 22:30  [ТС]     Указатели у стеков на голову и следующий элемент всегда Unable to read memory #3
Melg,
C++
1
AddInList4et(&temp, t->l, ++u); //С помощью рекурсии посещаем правое поддерево
с этим косяк, согласен, поправил ...
программа должна записать в один стек слова из дерева, с четной суммой кодов символов, а в другое с нечетной, но почему-то память под голову стека не выделяется
C++
1
MyList4et->Head = NULL; //Во избежание ошибок инициализируем первый элемент
Melg
417 / 153 / 62
Регистрация: 23.09.2013
Сообщений: 306
10.05.2014, 22:36     Указатели у стеков на голову и следующий элемент всегда Unable to read memory #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_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
11.05.2014, 00:10  [ТС]     Указатели у стеков на голову и следующий элемент всегда Unable to read memory #5
Melg, ведь если условие не выполнится, то изменится только состояния дерева ...
Melg
417 / 153 / 62
Регистрация: 23.09.2013
Сообщений: 306
11.05.2014, 00:20     Указатели у стеков на голову и следующий элемент всегда Unable to read memory #6
Я предлагаю поступить следующим образом: Вы измените код таким образом, чтобы Ваше дерево автоматически заполнялось некоторой последовательностью (а не как сейчас с клавиатуры). Далее - Вы скажите какой ожидается набор для двух заданных листов (т.е. как они должны заполниться из дерева) и что у Вас получилось на самом деле. Исходя из набора таких данных, возможно, мне удастся Вам помочь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2014, 04:04     Указатели у стеков на голову и следующий элемент всегда Unable to read memory
Еще ссылки по теме:

C++ Как передвигать указатель на следующий элемент массива структур?
C++ Найти максимальный элемент (из 10 чисел) и следующий за ним максимальный элемент
Указатель в списке ссылается на себя, а не на следующий элемент C++

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

Или воспользуйтесь поиском по форуму:
Fene4ka_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
13.05.2014, 04:04  [ТС]     Указатели у стеков на голову и следующий элемент всегда Unable to read memory #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;
}
а вот задание, которое было
Кликните здесь для просмотра всего текста
В узлах бинарного дерева расположены строки. Создать стек и
поместить в него все строки, содержащиеся в листьях дерева и
имеющие четную сумму кодов символов
Yandex
Объявления
13.05.2014, 04:04     Указатели у стеков на голову и следующий элемент всегда Unable to read memory
Ответ Создать тему
Опции темы

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