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

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

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

Работа с динамическими стеками - ошибка - C++

02.07.2014, 17:43. Просмотров 293. Ответов 0
Метки нет (Все метки)

Имеется задача:
Задание: смоделировать стек на основе односвязного списка и решить на этой структуре задачу по варианту из списка ниже. Создать интерактивное приложение с возможностью выбора команды: а) ввод данных в стек(и) из стандартного или нестандартного текстового файла(ов); б) вывод данных из всех стеков на экран (стандартный текстовый файл); в) решение задачи; г) освобождение стеков; д) выход.
Сама задача: Из элементов двух стеков, хранящих слова, собрать новый стек со словами, у которых первая и последняя буква совпадают (могут быть в разном регистре), изменив связи между элементами стеков (не выделяя новую память). Подходящие слова искать по-очереди в каждом из стеков. В исходных стеках должны остаться неиспользованные слова.


Написал такой код. После нескольких компиляций - заметил закономерность, что программа вылетает с ошибкой в том случае, если первые или последние элементы стеков удовлетворяют условию. Как я понял, происходит переполнение. Помогите найти ошибку.

Код:
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
 
struct TElem {
    char Info[31] ;
    TElem *Next;
};
 
//==============================================================================
char *ANSIUpperCase(char *s, char *S);
TElem* PushStack(TElem *St, char* Info); // добавить элемент в стек
char* PopStack(TElem **PSt);  //извлечь элемент из стека
// дополнительная процедура перекладывания элемента из одного стека (StTop) в другой(Dop)
void TopToTop (TElem **PSt1, TElem **PSt2); // без изменения адресов элементов, только связи
//----------первая часть: создание стека из текстового файла
TElem* CreateStack(TElem *St);
//----------вторая часть: вывод стека на экран ------
void OutputStack(TElem *St);
//----------третья часть: решение задачи -------------
void Decide(TElem **PSt1, TElem *St2, TElem **PSt3);
//----------четвертая часть: освобождение памяти -----
TElem* FreeStack(TElem *St);
 
//==============================================================================
 
char *ANSIUpperCase(char *s, char *S){
S = strcpy(S, s);
char *ch=S;
   while (*ch) {
        if (*ch>='a' && *ch<='z' || *ch>='а' && *ch<='я') *ch= *ch-32;
        if (*ch =='ё') *ch='Ё';
        ch++;
   }
   return S;
}
 
//==============================================================================
TElem* PushStack(TElem *St, char* Info){ // добавить элемент в стек
    TElem *Elem= new TElem;
    strcpy(Elem->Info, Info);
    Elem->Next = St;
    return Elem; // Адрес новой вершины
}
 
//==============================================================================
char* PopStack(TElem **PSt){ //извлечь элемент из стека
    TElem *Elem = *PSt;
    char* Info = Elem->Info;
    *PSt = Elem->Next;
    delete Elem;
    return Info;
}
// дополнительная процедура перекладывания элемента из одного стека (StTop) в другой(Dop)
void TopToTop (TElem **PSt1, TElem **PSt2){
    TElem *Elem, *StTop=*PSt1, *Dop=*PSt2;
    Elem = StTop;
    StTop = StTop->Next;  // или StTop=(*StTop).Next;
    Elem->Next = Dop;
    Dop = Elem;
    *PSt1 = StTop; *PSt2 = Dop;  // сохранить новые адреса вершин по адресам PSt1 и PSt2
    return;
}
 
//==============================================================================
TElem* CreateStack(TElem *St){
    int kol=0;
    char *n,*r;
    char Info[31];
 
    while(1){
        printf("Slovo (или **)=?");
        fgets(Info,30,stdin);  fflush(stdin);
        n = strchr(Info, '\n'); if (n) Info[n-Info]='\0';
        r = strchr(Info, '\r'); if (r) Info[r-Info]='\0';
        if (strncmp(Info, "**",2)==0) break;
        St = PushStack(St, Info);
        kol++;
    }
    printf("Создан стек из %d элементов\n", kol);
    printf("Press any key to continue\n");
    getch();
    return St;
}
 
//==============================================================================
void OutputStack(TElem *St){
    TElem *Dop=NULL;
    while (St){
        printf("%30s\n", St->Info);
        TopToTop(&St, &Dop);
    }
    while(Dop) TopToTop(&Dop, &St);
 
    printf("Press any key to continue");
    getch();
    return;
}
 
//==============================================================================
//==============================================================================
 
 
//----------четвертая часть: освобождение памяти -----
TElem* FreeStack(TElem *St){
    char* Info;
    while (St){
        Info = PopStack(&St);
    }
    return St;
}
 
//----------- РЕШЕНИЕ ----------------------------------------------------------
void Decide(TElem **PSt1, TElem **PSt2, TElem **PSt3){//(TElem **PSt1, TElem **PSt2, TElem **PSt3){
     TElem *St1=*PSt1, *St2=*PSt2, *St3=*PSt3, *Dop1=NULL, *Dop2=NULL;
     St3=FreeStack(St3);
char *c,*s;
int flag=1;
int flag2=1;
 
if ((St1==NULL) && (St2==NULL)){ 
printf ("\nСтеки пусты\n");
return ;}
 
 
while ( (flag==1) || (flag2==1) ){
      //для первого стека
      if (St1){
        c=ANSIUpperCase(St1->Info,c);
         int i=strlen(c);
          if(c[0]==c[i-1]) TopToTop(&St1,&St3);
          else TopToTop(&St1,&Dop1);
          }
      else flag=0;
      //------------------
      
      //для второго стека
      if (St2){
        c=ANSIUpperCase(St2->Info,c);
         int i=strlen(c);
          if(c[0]==c[i-1]) TopToTop(&St2,&St3);
          else TopToTop(&St2,&Dop2);
          }
      else flag2=0;
      //------------------
}
 
  while(Dop1){TopToTop(&Dop1,&St1);}
  while(Dop2){TopToTop(&Dop2,&St2);} 
 
 *PSt1=St1;
 *PSt2=St2; 
 *PSt3=St3; 
 
 printf("Было произведено решение\n");
    return ;  // новый адрес через результат функции вернется
}
 
//==============================================================================
 
int main(){
TElem *StackTop1=NULL, *StackTop2=NULL, *StackTop3=NULL;
SetConsoleOutputCP(1251);SetConsoleCP(1251);  char ch;
do{
printf(" Выберите номер нужного действия:\n1. Создать стеки\n2. Ввести стеки на экран\n\
3. Решить задачу\n4. Освободить память\n5. Выход\n");
 
ch=getchar();
fflush(stdin);
switch (ch){
case '1': if (StackTop1) {
                    printf("Error: сначала надо освободить память!"); break;
                }
                StackTop1 = CreateStack(StackTop1);
                if (StackTop2) {
                    printf("Error: сначала надо освободить память!"); break;
                }
                StackTop2 = CreateStack(StackTop2);
                break;
case '2': printf("Первый стек:\n"); OutputStack(StackTop1);
                printf("\nВторой стек :\n"); OutputStack(StackTop2);
                printf("\nТретий стек (результат):\n"); OutputStack(StackTop3);
                break;
case '3': Decide(&StackTop1, &StackTop2, &StackTop3);
                break;
case '4':StackTop1=FreeStack(StackTop1);
                StackTop2=FreeStack(StackTop2);
                StackTop3=FreeStack(StackTop3);
                printf("Вся память под стеки особождена\n");
                break;
case '5':return 0;
default: printf("Нет такой команды\nPress any key");
getch();}
} while (ch!='5');
 
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2014, 17:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с динамическими стеками - ошибка (C++):

Работа со стеками - C++
Люди подскажите как написать функцию для вывода на экран заданного элемента стека к примеру 3 или 5)

Работа со стеками - C++
Разработать программу, определяющую симметричность произвольного текста любой длины. Текст всегда должен оканчиваться точкой. Эту задачу...

Работа со стеками - C++
С чем связанны данные ошибки. Компилятор вижак 10 экспресс выпуск. #include &lt;fstream&gt; using namespace std; #include &quot;stack.cpp&quot;//не...

Работа со стеками на Dev C++ - C++
задание такое: удалить из списка все вхождения элемента , имеющего заданное значение. Ошибку выводит , что не объявлен random . Помогите...

Работа со стеками и удаление максимального - C++
Нужно найти самые большой элемент и удалить его из ммассива Добавлено через 10 секунд ...

Работа со стеками, объяснение кода программы - C++
Есть код программы (вырванный из целой проги кусок). В нем используются стеки. Помогите, пожалуйста, построчно (максимально подробно)...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2014, 17:43
Привет! Вот еще темы с ответами:

Работа с динамическими строками - C++
Все здравствуйте. Есть вот такое задание к нему программа. Среда разработки - VS 2005. Компиляция проходит без ошибок, однако после ввода...

работа с динамическими массивами - C++
Всё что нужно, это рассчитать размерность массива через функцию, но в main я получаю, а если передаю массив в функцию то получаю 1, как...

Работа с динамическими массивами - C++
Помогите пожалуйста с программой,это должна быть одна программа.. 1)Как написать процедуру для заполнение двумерного массива случайными...

Работа с динамическими массивами - C++
Здравствуйте. Помогите, пожалуйста, написать программу 1. Использующую потоки cout и cin для ввода/вывода. Программа должна использовать...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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