Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 19.05.2012, 11:04   #1
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
Репутация: 23
По умолчанию Сортировка стека через массив

Собственно реализую сортировку стека, но при работе вылетает ошибка

вот собственно код сортировки


Код:
int ElStack=0,error1,z,b;
 int *MasStack=new int[ElStack];
 while (error1!=1)
 {
 z=pop(&s,&error1);
 if(error1!=1)
 {ElStack++;
 MasStack[ElStack-1]=z;
 }

 }
 for (int k = 0; k < ElStack - 1; k++)
 {
 int kmin = k;
 for (int j = k + 1; j < ElStack; j++)
 if (MasStack[j] < MasStack[kmin]) kmin = j;
 int a = MasStack[k];
 MasStack[k] = MasStack[kmin];
 MasStack[kmin] = a;
 }
 for(int i=0; i<ElStack; i++)
 { push(&s,MasStack[i]);
 b=peek(&s,&error);
 Form1->StringGrid1->Cells[1][i]=b;}
При построчной компиляции программа падает на моменте выделенным жирным ширфтом



вот код стека


Код:
#include <alloc.h>
//#include "stack.h"
#define STACK struct stack
STACK {
int info;
STACK *next;
};
extern void push(STACK **s, int item);
extern int pop(STACK **s, int *error);
extern int peek(STACK **s, int *error);

void push (STACK **s, int item)
{
STACK *new_item=(STACK*)malloc(sizeof(STACK));
new_item->info=item;
new_item->next=*s;
*s=new_item;
}
int pop(STACK **s, int *error)
{
/* *error = 0, если операция POP выполнена успешно, иначе= 1 */
STACK *old_item=*s;
int old_info=0;
if (*s)
{
old_info=old_item->info;
*s=old_item->next;
free(old_item);
*error=0;
}
else
*error =1 ;
return (old_info);
}
int peek (STACK **s, int *error)
{
/**error = 0 , если в стеке не меньше 1 элемента,
*error = 1 ,ели в стеке нет элементов
*/
if (*s)
{
*error=0;
return(*s)->info;
}
else
{
*error =1;
return 0;
}

Последний раз редактировалось ACE Valery; 19.05.2012 в 18:44.
D00M вне форума   Ответить с цитированием
Старый 19.05.2012, 13:22   #2
ACE Valery
Сама себе режиссер
СуперМодератор
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Адрес: Украина
Сообщений: 3,315
Репутация: 3121
По умолчанию

а) во-первых, картинка не открывается
б) во-вторых, чего уж там кусочек кода, давайте весь
в) в-третьих, нужна ошибка, с которой программа падает
__________________
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума   Ответить с цитированием
Старый 19.05.2012, 13:44   #3
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
Репутация: 23
По умолчанию

Поправил, добавил код стека
D00M вне форума   Ответить с цитированием
Старый 19.05.2012, 18:44   #4
ACE Valery
Сама себе режиссер
СуперМодератор
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Адрес: Украина
Сообщений: 3,315
Репутация: 3121
По умолчанию

проверять времени нет, но похоже, что вы выходите за границу массива
__________________
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума   Ответить с цитированием
Старый 19.05.2012, 19:16   #5
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
Репутация: 23
По умолчанию

Не много поработал над кодем... и зашел в тупик... после первой сортировки программа отрабатывает правильно, но если очистить стек и заново записать случайным образом, то при повторной сортировке вылетает ошибка


Код:
int ElStack=0,error1,z,b,i;
int *MasStack=new int[ElStack];
for(int i = 1; i < StringGrid1->ColCount; i++)
    for(int j = 0; j < StringGrid1->RowCount; j++)
    StringGrid1->Cells[i][j] = "";

 while (error1!=1)
      {
       z=pop(&y,&error1);
       if(error1!=1)
       {ElStack++;
        MasStack[ElStack-1]=z;
       }

      }
for (int k = 0; k < ElStack - 1; k++)
{
        int kmin = k;
	        for (int j = k + 1; j < ElStack; j++)
                     if (MasStack[j] < MasStack[kmin]) kmin = j;
	             int a = MasStack[k];
	             MasStack[k] = MasStack[kmin];
                     MasStack[kmin] = a;
}

for(i=0; i<=ElStack-1; i++)
 { push(&y,MasStack[i]);
   b=peek(&y,&error);
  Form1->StringGrid1->Cells[2][i]=b;;
 }




Последний раз редактировалось Stilet; 19.05.2012 в 19:50.
D00M вне форума   Ответить с цитированием
Старый 20.05.2012, 20:54   #6
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
Репутация: 23
По умолчанию

Может ли быть это из за билдера?
D00M вне форума   Ответить с цитированием
Старый 22.05.2012, 20:54   #7
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
Репутация: 23
По умолчанию

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

Код:
void sort(STACK **s) {
	
	STACK *top = *s;
	while ((*s)->next) {
		STACK *tmp = (*s)->next;
		while (tmp) {
			if (tmp->info < (*s)->info) {
				int temp =(*s)->info;
				(*s)->info = tmp->info;
				tmp->info = temp;
			}
			tmp = tmp->next;
		}
		(*s) = (*s)->next;
	}
	*s = top;
}
D00M вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализация стека через односвязный список snusnu Общие вопросы C/C++ 7 06.04.2014 23:59
Сортировка стека dzega Общие вопросы C/C++ 1 03.01.2011 22:53
паскаль,одномерный массив,сортировка вставка,сортировка убывания,от максимального до конца немозг Помощь студентам 11 06.02.2010 22:57
помогите. массив не взамодействует с функцией. какая-то ошибка стека. koir Паскаль 5 10.06.2008 08:32


04:10.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.