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

Указатели у стеков на голову и следующий элемент всегда 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 MainWindow::convolution(int x, int y, float matrix,int matrixsize, PImage img) { float rtotal = 0.0; float gtotal = 0.0; float btotal = 0.0; int offset = matrixsize / 2; //смещение for (int i...
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; char c;
C++ Указатели на массивы: В чем принципиальное различие между объявлениями указателей? Вопрос по теории В чем принципиальное различие между данными обьявлениями? (+ правильно ли я понимаю, что 1и2, 3и4 это синонимы?) int main(int argc, char** argv) int main(int argc, char **argv) int main(int argc, char *argv) int main(int argc, char* argv) допустимо ли так же писать: подробнее

Показать сообщение отдельно
Fene4ka_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
13.05.2014, 04:04  [ТС]     Указатели у стеков на голову и следующий элемент всегда Unable to read memory
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;
}
а вот задание, которое было
Кликните здесь для просмотра всего текста
В узлах бинарного дерева расположены строки. Создать стек и
поместить в него все строки, содержащиеся в листьях дерева и
имеющие четную сумму кодов символов
 
Текущее время: 12:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru