Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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


Код:
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,365
По умолчанию

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

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

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

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


Код:
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
По умолчанию

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

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

Код:
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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



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