задали в самом начале учебы после долгого отдыха задачу:
создать программу на С, в которой будут работать функции добавления и удаления следующего элемента стека
вот написала код, но он не хочет работать, помогите плиз
Хм... да много чего неправильного получается, давайте сначала начнём.
Насколько я понимаю, данные должны вводиться с клавиатуры....
Они нигде не вводятся, не генерируются, не хранятся в коде программы...
end=PutInStack(end); - никогда не вернёт NULL, поскольку malloc вернёт NULL только когда не сможет выделить память)))
Предлагаю исправить для начала схему генерирования нового элемента.
Если специальность связана с программированием рекомендую сразу использовать стандартную терминологию:
push - "запихнуть" в стек
pop - "вытолкнуть".
Да и с другими структурами данных в принципе то же самое.
PS. ВНТУ - случаем, не Волынский университет?
нет, не Волынский, а Винницкий Х)
спасибо за совет, сейчас поищу ифну про них и попробую еще раз
будете смеяться, у нас еще не выкладывали материал по этим функциям
я вот нашла в электронном виде пару заготовок, они подойдут?
#define MAXVAL 10
int sp = 0;
double val[MAXVAL];
void push(double f)
{
if (sp ‹ MAXVAL)
val[sp++] = f;
else
printf("ошибка: стек полон, %g не помещается\n", f);
}
double pop(void)
{
if (sp › 0)
return val[-sp];
else {
printf ("ошибка: стек пуст\n");
return 0.0;
}
}
Это немножко другой стек... Стек на массиве. Статическая структура данных. В принципе тоже годится. Но, на мой взгляд, полезнее понять динамические структуры данных. То есть, когда ограничение на размер стека заранее неизвестно.
об указателях понятие дали вам или нет?
просто без них ничего не объяснить...
будете смеяться - нам ничего не дали, первые же дни, только задания, мол дерзай молодежь Х)
1 курс?!!! ничего не объяснив, сказали писать на С? Реализовывать стэк?
А что такое стек понятно?
да ну на 1 курсе в начале стеки))))) нееее))))))))
хотя если в универ после чего то, то могут и так поиздеваться(
тихо-ша Х) это начало второго курса
мы по лекциям в прошлом году само понятие учили в скольз, но как с ним работать не учили, практических занятий не было
я вот нашла у знакомого такую программку, по ходу оно, зацените
# include <stdio.h>
# include <stdlib.h>
struct stackNode
{
int data;
struct stackNode *neatPtr;
};
typedef struct stackNode STACKNODE;
typedef STACKNODE *STACKNODEPTR;
void push (STACKNODEPTR*,int);
int pop (STACKNODEPTR*);
int isEmpty (STACKNODEPTR);
void printStack(STACKNODEPTR);
void instructions(void);
main()
{
STACKNODEPTR stackPtr=NULL;
int choice,value;
instructions();
printf("? ");
scanf("%d",&choice);
while (choice!=3)
{
switch(choice)
{
case 1:
printf("Enter an intager: "); //запихиваем в стех
scanf("%d",&value);
push(&stackPtr,value);
printStack (stackPtr);
break;
case 2: //берем из стека
if (!isEmpty(stackPtr)) printf("The popper value is %d.\n",pop(&stackPtr));
printStack (stackPtr);
break;
default:
printf("Invalid choice.\n\n");
instructions();
break;
}
printf("? ");
scanf("%d",&choice);
}
printf("End of r.\n");
return 0;
}
// Распечатка инструкций
void instructions (void)
{
printf("Enter choice:\n"
"1 to push a value on the stack\n"
"2 to pup a value off the stack\n"
"1 to end program\n"
);
}
// Помещаем в стек
void push (STACKNODEPTR *topPtr,int info)
{
STACKNODEPTR newPtr;
newPtr=malloc(sizeof(STACKNODE));
if (newPtr!=NULL) {
newPtr->data=info;
newPtr->neatPtr=*topPtr;
*topPtr=newPtr;
}
else printf("%d not inserted. No memory available.\n",info);
}
// Берем из стека
int pop (STACKNODEPTR *topPtr)
{
STACKNODEPTR tempPtr;
int popValue;
tempPtr=*topPtr;
popValue=(*topPtr)->data;
*topPtr=(*topPtr)->neatPtr;
free(tempPtr);
return popValue;
}
// распечатка стека
void printStack(STACKNODEPTR currentPtr)
{
if (currentPtr==NULL) printf("The stack is empty.\n\n");
else {
printf("the srack is:\n");
while (currentPtr!=NULL){
printf("%d->",currentPtr->data);
currentPtr=currentPtr->neatPtr;
}
printf("NULL\n\n");
}
}
// пустой ли стек
int isEmpty(STACKNODEPTR topPtr)
{
return topPtr==NULL;
}
Советую сначала понять, зачем оно надо, или хотя бы подробно разобраться, как работает.
Написано вот тут:
http://goodsoft.org.ua/ru/data_struct/stack.html
и тут
http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA
Программулька вроде как рабочая...
Смутило две вещи на первый взгляд:
main без типа (противоречит концепции С)
И ещё я не уверен, что
printf("Enter choice:\n"
"1 to push a value on the stack\n"
"2 to pup a value off the stack\n"
"1 to end program\n"
);
работает, хотя и не говорю, что 100% работоспособно.
Кстати, по первой ссылке есть примеры реализации стека.
спасибо за наводку, теперь-то я точно ее сделаю Х)
ну словом в предыдущем коде были ошибки, вот правильный код, работающий )
(ух и долго же я билась над ним Х)))
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
struct stackNode
{
int data;
struct stackNode *neatPtr;
};
typedef struct stackNode STACKNODE;
typedef STACKNODE *STACKNODEPTR;
void push (STACKNODEPTR*, int);
int pop (STACKNODEPTR*);
int isEmpty (STACKNODEPTR);
void printStack(STACKNODEPTR);
void instructions(void);
main()
{
STACKNODEPTR stackPtr=NULL;
int choice,value;
instructions();
printf("? ");
scanf("%d",&choice);
while(choice!=0)
{
switch(choice)
{
case 1:
printf("enter an intager: ");
scanf("%d",&value);
push(&stackPtr,value);
printStack(stackPtr);
break;
case 2: if (!isEmpty(stackPtr)) printf("the popper value is %d.\n",pop(&stackPtr));
printStack(stackPtr);
break;
default:
printf("invalid choice.\n\n");
instructions();
break;
}
printf("? ");
scanf("%d",&choice);
}
printf("end of r.\n");
return 0;
}
void instructions(void)
{
printf("enter choice:\n"
"1 to push a value on the stack\n"
"2 to pup a value off the stack\n"
"0 to end program\n"
);
}
void push(STACKNODEPTR *topPtr, int info) /
{
STACKNODEPTR newPtr;
newPtr=(STACKNODEPTR) malloc(sizeof(STACKNODE));
if(newPtr!=NULL) //
{
newPtr->data=info;
newPtr->neatPtr=*topPtr;
*topPtr=newPtr;
}
else printf("%d not inserted.no memory available.\n",info);
}
int pop (STACKNODEPTR *topPtr) /
{
STACKNODEPTR tempPtr;
int popValue;
tempPtr=*topPtr;
popValue=(*topPtr)->data;
*topPtr=(*topPtr)->neatPtr;
free(tempPtr);
return popValue;
}
void printStack(STACKNODEPTR currentPtr)
{
if(currentPtr==NULL) printf("the stack is empty.\n\n");
else{
printf("the stack is:\n");
while(currentPtr!=NULL)
{
printf("%d->",currentPtr->data);
currentPtr=currentPtr->neatPtr;
}
printf("NULL\n\n");
}
}
int isEmpty(STACKNODEPTR topPtr)
{
return topPtr==NULL;
}
знаете как радовалась когда начала работать? ахаха, уйма эмоций Х)
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)