Помощь - Поиск - Пользователи - Календарь
Полная версия: операции над стеком в C > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
Matadora
задали в самом начале учебы после долгого отдыха задачу:
создать программу на С, в которой будут работать функции добавления и удаления следующего элемента стека
вот написала код, но он не хочет работать, помогите плиз
Код

#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
Хм... да много чего неправильного получается, давайте сначала начнём.
Насколько я понимаю, данные должны вводиться с клавиатуры....
Они нигде не вводятся, не генерируются, не хранятся в коде программы...

end=PutInStack(end); - никогда не вернёт NULL, поскольку malloc вернёт NULL только когда не сможет выделить память)))
Предлагаю исправить для начала схему генерирования нового элемента.

Если специальность связана с программированием рекомендую сразу использовать стандартную терминологию:
push - "запихнуть" в стек
pop - "вытолкнуть".
Да и с другими структурами данных в принципе то же самое.

PS. ВНТУ - случаем, не Волынский университет?
Matadora
нет, не Волынский, а Винницкий Х)

спасибо за совет, сейчас поищу ифну про них и попробую еще раз
Matadora
будете смеяться, у нас еще не выкладывали материал по этим функциям
я вот нашла в электронном виде пару заготовок, они подойдут?

#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
Это немножко другой стек... Стек на массиве. Статическая структура данных. В принципе тоже годится. Но, на мой взгляд, полезнее понять динамические структуры данных. То есть, когда ограничение на размер стека заранее неизвестно.
Vahappaday
об указателях понятие дали вам или нет?
просто без них ничего не объяснить...
Matadora
будете смеяться - нам ничего не дали, первые же дни, только задания, мол дерзай молодежь Х)
Vahappaday
1 курс?!!! ничего не объяснив, сказали писать на С? Реализовывать стэк?
А что такое стек понятно?
julia_lisha
да ну на 1 курсе в начале стеки))))) нееее))))))))
хотя если в универ после чего то, то могут и так поиздеваться(
Matadora
тихо-ша Х) это начало второго курса
мы по лекциям в прошлом году само понятие учили в скольз, но как с ним работать не учили, практических занятий не было
я вот нашла у знакомого такую программку, по ходу оно, зацените

# 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
Советую сначала понять, зачем оно надо, или хотя бы подробно разобраться, как работает.

Написано вот тут:
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
спасибо за наводку, теперь-то я точно ее сделаю Х)
Matadora
ну словом в предыдущем коде были ошибки, вот правильный код, работающий )
(ух и долго же я билась над ним Х)))

#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
thumbsup.gif
Matadora
знаете как радовалась когда начала работать? ахаха, уйма эмоций Х)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.