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

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

Восстановить пароль Регистрация
 
Nekit0939
0 / 0 / 0
Регистрация: 02.07.2014
Сообщений: 2
02.07.2014, 17:43     Работа с динамическими стеками - ошибка #1
Имеется задача:
Задание: смоделировать стек на основе односвязного списка и решить на этой структуре задачу по варианту из списка ниже. Создать интерактивное приложение с возможностью выбора команды: а) ввод данных в стек(и) из стандартного или нестандартного текстового файла(ов); б) вывод данных из всех стеков на экран (стандартный текстовый файл); в) решение задачи; г) освобождение стеков; д) выход.
Сама задача: Из элементов двух стеков, хранящих слова, собрать новый стек со словами, у которых первая и последняя буква совпадают (могут быть в разном регистре), изменив связи между элементами стеков (не выделяя новую память). Подходящие слова искать по-очереди в каждом из стеков. В исходных стеках должны остаться неиспользованные слова.


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

Код:
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');
 
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2014, 17:43     Работа с динамическими стеками - ошибка
Посмотрите здесь:

Работа со стеками C++
C++ Работа с динамическими массивами
C++ Работа со стеками
C++ Работа с динамическими массивами
C++ работа с динамическими массивами
C++ Работа с динамическими массивами
Работа с динамическими строками C++
Работа со стеками на Dev C++ C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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