Форум: "Прочее";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
ВнизСи - чего ему не нравится? Найти похожие ветки
← →
ArtemESC © (2006-10-27 02:04) [0]Модуль для работы со стеком
#include <stdlib.h>
struct sStackItem {
void *data;
struct sStackItem *prev;
};
typedef sStackItem *StackItem;
struct sStack {
unsigned count;
StackItem pointer;
};
typedef sStack *Stack;
Stack newstack()
{
return (Stack) malloc(sizeof(sStack));
}
StackItem newstackitem()
{
return (StackItem) malloc(sizeof(sStackItem));
}
void push(Stack S, void *item)
{
if (S == NULL)
{
S = newstack();
S->pointer = NULL;
S->count = 0;
}
StackItem p = newstackitem();
p->data = item;
p->prev = S->pointer;
S->pointer = p;
S->count++;
}
void *pop(Stack S)
{
if ((S == NULL) || (S->pointer == NULL))
return NULL;
StackItem p = S->pointer;
S->pointer = p->prev;
S->count--;
return p->data;
}
Использую (для теста) так:#include "stacks.c"
#include <stdlib.h>
#include <stdio.h>
int main()
{
extern void *pop(Stack);
Stack S;
int i;
for (i = 1; i <= 10; i++)
{
int *p;
p = (int*) malloc(sizeof(int));
*p = i;
push(S, p);
}
for (i = 1; i <= 10; i++)
{
int *p = (int*) pop(S);
printf("get element %d\n", *p);
free(p);
}
return 0;
}
← →
Суслик © (2006-10-27 02:05) [1]
> ArtemESC © (27.10.06 02:04)
старик, вроде не первый день на форуме - так *вопросы* не задают :)
← →
wicked © (2006-10-27 02:08) [2]а где ругается то?
а то там много чего "не так", только, может, ты имеешь в виду что то конкретное?...
← →
ArtemESC © (2006-10-27 02:10) [3]wicked © (27.10.06 02:08) [2]
Да он и не ругаеться вовсе, просто делает не то что надо - или, точнее, вовсе ничего не делает, а должен просто распечатать числа от 10 до 1 из стека...
← →
ArtemESC © (2006-10-27 02:16) [4]Одну ошибку нашел, нужно не
Stack S;
, аStack S = NULL;
, но это не помогло...
← →
Ketmar © (2006-10-27 02:17) [5]>[3] ArtemESC(c) 27-Oct-2006, 02:10
у меня это не скомпилировалось ни при помощи bcc, ни при помощи lcc. PellesC тоже подавился.
← →
ArtemESC © (2006-10-27 02:18) [6]Ketmar © (27.10.06 02:17) [5]
Попробуй с помощью bc, у меня скомпилировалось...
← →
Ketmar © (2006-10-27 02:30) [7]>[6] ArtemESC(c) 27-Oct-2006, 02:18
>Попробуй с помощью bc, у меня скомпилировалось...
что было в наличии из современных компиляторов -- то и попробовал. все подавились и отрыгнули.
← →
Джо © (2006-10-27 03:01) [8]Господи прости, какие извращения...
← →
Проходил тут (2006-10-27 06:58) [9]Вот вариант (я все водин листинг слил):
#include <stdlib.h>
#include <stdio.h>
struct sStackItem {
void *data;
struct sStackItem *prev;
};
typedef sStackItem *StackItem;
struct sStack {
unsigned count;
StackItem pointer;
};
typedef sStack *Stack;
Stack newstack()
{
return (Stack) malloc(sizeof(sStack));
}
StackItem newstackitem()
{
return (StackItem) malloc(sizeof(sStackItem));
}
void push(Stack* S, void *item)
{
if ((*S) == NULL)
{
(*S) = newstack();
(*S)->pointer = NULL;
(*S)->count = 0;
}
StackItem p = newstackitem();
p->data = item;
p->prev = (*S)->pointer;
(*S)->pointer = p;
(*S)->count++;
}
void *pop(Stack S)
{
if ((S == NULL) || (S->pointer == NULL))
return NULL;
StackItem p = S->pointer;
S->pointer = p->prev;
S->count--;
return p->data;
}
int main()
{
Stack S = NULL;
int i;
for (i = 1; i <= 10; i++)
{
int *p;
p = (int*) malloc(sizeof(int));
*p = i;
push(&S, p);
}
for (i = 1; i <= 10; i++)
{
int *p = (int*) pop(S);
printf("get element %d\n", *p);
free(p);
}
return 0;
}
Проблема в том, что при выходе из первого цикла ты предполагаешь что в S есть адрес последнего элемента в стеке (Чего на самом деле нет). Хотя ИМХО не самая удачная реализация. Подумай еще.
← →
Celades (2006-10-27 10:24) [10]
void push(Stack S, void *item)
{
if (S == NULL)
{
S = newstack();
S->pointer = NULL;
S->count = 0;
}
StackItem p = newstackitem();
p->data = item;
p->prev = S->pointer;
S->pointer = p;
S->count++;
}
Вот здесь память выделеенная в "S = newstack();" теряется навсегда, после выхода из функции. Надо изменять сигнатуру функции: "void push(Stack* S, void *item)"
← →
ArtemESC © (2006-10-27 17:53) [11]Джо © (27.10.06 03:01) [8]
Господи прости, какие извращения...
В Си? Или в моем коде...
Проходил тут (27.10.06 06:58) [9]
Celades (27.10.06 10:24) [10]
Вот здесь память выделеенная в "S = newstack();" теряется навсегда, после выхода из функции. Надо изменять сигнатуру функции: "void push(Stack* S, void *item)"
Ну точно - спасибо большое - никак не привыкну к си...
← →
Celades (2006-10-27 19:06) [12]
> никак не привыкну к си...
Ну на Delphi тоже самое:)
← →
Слоник_ (2006-10-27 19:18) [13]
> Ну на Delphi тоже самое:)
если S - не экземпляр класса...
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c