Matadora
Сообщение
#61440 4.9.2010, 16:40
задали в самом начале учебы после долгого отдыха задачу:
создать программу на С, в которой будут работать функции добавления и удаления следующего элемента стека
вот написала код, но он не хочет работать, помогите плиз
Код
#include<stdio.h>
#include<stdlib.h>
#define MES_LEN 10
typedef struct inform {
int index;
char message[MES_LEN];
} INFORM;
typedef struct list_elem {
INFORM inform;
struct list_elem *next;
} LEL;
LEL* PutInStack(INFORM data);
void PrintList(void);
LEL* GetFromStack(INFORM* pdat);
LEL *list;
int main(void)
{
LEL *end=NULL;
puts("\t\t Vhidni dani:");
do {
end=PutInStack(end);
} while (end!=NULL);
puts("\n\n\t Vvedeno dani v stek:");
PrintList();
GetFromStack();
PrintList();
return 0;
}
void PrintList(void)
{
LEL *pel=list;
while(pel!=NULL)
{
printf("\n%-8d%-70s", pel->inform.index, pel->inform.message);
pel=pel->next;
}
}
LEL* PutInStack(INFORM data)
{
LEL *pnew;
pnew=(LEL*)malloc(sizeof(LEL));
pnew->inform=data;
pnew->next=list;
list=pnew;
return pnew;
}
LEL* GetFromStack(INFORM* pdat)
{
LEL *ph=list;
if (ph==NULL) return NULL;
*pdat=ph->inform;
list=list->next;
free(ph);
return list;
}
Vahappaday
Сообщение
#61442 4.9.2010, 17:21
Хм... да много чего неправильного получается, давайте сначала начнём.
Насколько я понимаю, данные должны вводиться с клавиатуры....
Они нигде не вводятся, не генерируются, не хранятся в коде программы...
end=PutInStack(end); - никогда не вернёт NULL, поскольку malloc вернёт NULL только когда не сможет выделить память)))
Предлагаю исправить для начала схему генерирования нового элемента.
Если специальность связана с программированием рекомендую сразу использовать стандартную терминологию:
push - "запихнуть" в стек
pop - "вытолкнуть".
Да и с другими структурами данных в принципе то же самое.
PS. ВНТУ - случаем, не Волынский университет?
Matadora
Сообщение
#61444 4.9.2010, 17:24
нет, не Волынский, а Винницкий Х)
спасибо за совет, сейчас поищу ифну про них и попробую еще раз
Matadora
Сообщение
#61445 4.9.2010, 17:34
будете смеяться, у нас еще не выкладывали материал по этим функциям
я вот нашла в электронном виде пару заготовок, они подойдут?
#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;
}
}
Vahappaday
Сообщение
#61446 4.9.2010, 17:50
Это немножко другой стек... Стек на массиве. Статическая структура данных. В принципе тоже годится. Но, на мой взгляд, полезнее понять динамические структуры данных. То есть, когда ограничение на размер стека заранее неизвестно.
Vahappaday
Сообщение
#61449 4.9.2010, 18:48
об указателях понятие дали вам или нет?
просто без них ничего не объяснить...
Matadora
Сообщение
#61450 4.9.2010, 20:19
будете смеяться - нам ничего не дали, первые же дни, только задания, мол дерзай молодежь Х)
Vahappaday
Сообщение
#61451 4.9.2010, 21:31
1 курс?!!! ничего не объяснив, сказали писать на С? Реализовывать стэк?
А что такое стек понятно?
julia_lisha
Сообщение
#61461 5.9.2010, 9:50
да ну на 1 курсе в начале стеки))))) нееее))))))))
хотя если в универ после чего то, то могут и так поиздеваться(
Matadora
Сообщение
#61469 5.9.2010, 13:22
тихо-ша Х) это начало второго курса
мы по лекциям в прошлом году само понятие учили в скольз, но как с ним работать не учили, практических занятий не было
я вот нашла у знакомого такую программку, по ходу оно, зацените
# 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;
}
Vahappaday
Сообщение
#61477 5.9.2010, 14:43
Советую сначала понять, зачем оно надо, или хотя бы подробно разобраться, как работает.
Написано вот тут:
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% работоспособно.
Кстати, по первой ссылке есть примеры реализации стека.
Matadora
Сообщение
#61478 5.9.2010, 15:04
спасибо за наводку, теперь-то я точно ее сделаю Х)
Matadora
Сообщение
#61685 14.9.2010, 18:07
ну словом в предыдущем коде были ошибки, вот правильный код, работающий )
(ух и долго же я билась над ним Х)))
#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;
}
julia_lisha
Сообщение
#61714 16.9.2010, 12:14
Matadora
Сообщение
#61724 17.9.2010, 6:10
знаете как радовалась когда начала работать? ахаха, уйма эмоций Х)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.