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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Функция cleanup http://www.cyberforum.ru/cpp-beginners/thread1171351.html
Что это за функция такая - cleanup? зачем она нужна? И что означает она ,например, в записи : if (FALSE == a) { wprintf(L"failed.\n"); goto cleanup; ...
C++ Из целочисленного массива Х(Н) записать в массив У(К) каждый второй элемент Из целочисленного массива Х(Н) записать в массив У(К) каждый второй элемент. Удалить в каждом массиве наибольший и наименьший элементы. В программе написать функции формирование массива У, поиска... http://www.cyberforum.ru/cpp-beginners/thread1171330.html
C++ Code Blocks и файл ресурсов
Как приковать файл rc к программе в Code Blocks? Пытался по-разному: компилировал и встроенным компиляторомGNU GCC), и Resource Builder, а все равно ничего не получается. Помогите, пожалуйста.
Что делает функция constrain ? C++
В коде функции почти разобрался, но там есть одна функция constrain, которая не знаю что возвращает и как узнать не знаю. Сам код это преобразование цвета пикселя матрицей свёртки: void...
C++ Стек через связный список http://www.cyberforum.ru/cpp-beginners/thread1171313.html
Здравствуйте мне нужно переделать стек через указатели и связный список. #include <iostream> #include <locale.h> using namespace std; const int n=10; class STACK_A { private: int top;...
C++ Указатели на массивы: В чем принципиальное различие между объявлениями указателей? Вопрос по теории В чем принципиальное различие между данными обьявлениями? (+ правильно ли я понимаю, что 1и2, 3и4 это синонимы?) int main(int argc, char** argv) int main(int argc, char **argv)... подробнее

Показать сообщение отдельно
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
10.05.2014, 21:11
Я попробую Вам помочь, но для этого мне нужно Ваше содействие. Для начала - очень здорово когда программа является кросс-платформенной, например я компилирую Ваш код в 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.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru