IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> операции над стеком в C, помогите написать правильный код к простой задаче
Matadora
сообщение 4.9.2010, 16:40
Сообщение #1


Школьник
*

Группа: Продвинутые
Сообщений: 16
Регистрация: 4.9.2010
Город: Ukraine
Учебное заведение: ВНТУ
Вы: студент



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

#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
сообщение 4.9.2010, 17:21
Сообщение #2


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Хм... да много чего неправильного получается, давайте сначала начнём.
Насколько я понимаю, данные должны вводиться с клавиатуры....
Они нигде не вводятся, не генерируются, не хранятся в коде программы...

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

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

PS. ВНТУ - случаем, не Волынский университет?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Matadora
сообщение 4.9.2010, 17:24
Сообщение #3


Школьник
*

Группа: Продвинутые
Сообщений: 16
Регистрация: 4.9.2010
Город: Ukraine
Учебное заведение: ВНТУ
Вы: студент



нет, не Волынский, а Винницкий Х)

спасибо за совет, сейчас поищу ифну про них и попробую еще раз
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Matadora
сообщение 4.9.2010, 17:34
Сообщение #4


Школьник
*

Группа: Продвинутые
Сообщений: 16
Регистрация: 4.9.2010
Город: Ukraine
Учебное заведение: ВНТУ
Вы: студент



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

#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
сообщение 4.9.2010, 17:50
Сообщение #5


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Это немножко другой стек... Стек на массиве. Статическая структура данных. В принципе тоже годится. Но, на мой взгляд, полезнее понять динамические структуры данных. То есть, когда ограничение на размер стека заранее неизвестно.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 4.9.2010, 18:48
Сообщение #6


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



об указателях понятие дали вам или нет?
просто без них ничего не объяснить...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Matadora
сообщение 4.9.2010, 20:19
Сообщение #7


Школьник
*

Группа: Продвинутые
Сообщений: 16
Регистрация: 4.9.2010
Город: Ukraine
Учебное заведение: ВНТУ
Вы: студент



будете смеяться - нам ничего не дали, первые же дни, только задания, мол дерзай молодежь Х)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 4.9.2010, 21:31
Сообщение #8


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



1 курс?!!! ничего не объяснив, сказали писать на С? Реализовывать стэк?
А что такое стек понятно?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
julia_lisha
сообщение 5.9.2010, 9:50
Сообщение #9


Студент
**

Группа: Продвинутые
Сообщений: 147
Регистрация: 19.12.2009
Из: Omsk
Город: omsk
Учебное заведение: ОмГУ



да ну на 1 курсе в начале стеки))))) нееее))))))))
хотя если в универ после чего то, то могут и так поиздеваться(
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Matadora
сообщение 5.9.2010, 13:22
Сообщение #10


Школьник
*

Группа: Продвинутые
Сообщений: 16
Регистрация: 4.9.2010
Город: Ukraine
Учебное заведение: ВНТУ
Вы: студент



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

# 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
сообщение 5.9.2010, 14:43
Сообщение #11


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Советую сначала понять, зачем оно надо, или хотя бы подробно разобраться, как работает.

Написано вот тут:
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
сообщение 5.9.2010, 15:04
Сообщение #12


Школьник
*

Группа: Продвинутые
Сообщений: 16
Регистрация: 4.9.2010
Город: Ukraine
Учебное заведение: ВНТУ
Вы: студент



спасибо за наводку, теперь-то я точно ее сделаю Х)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Matadora
сообщение 14.9.2010, 18:07
Сообщение #13


Школьник
*

Группа: Продвинутые
Сообщений: 16
Регистрация: 4.9.2010
Город: Ukraine
Учебное заведение: ВНТУ
Вы: студент



ну словом в предыдущем коде были ошибки, вот правильный код, работающий )
(ух и долго же я билась над ним Х)))

#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
сообщение 16.9.2010, 12:14
Сообщение #14


Студент
**

Группа: Продвинутые
Сообщений: 147
Регистрация: 19.12.2009
Из: Omsk
Город: omsk
Учебное заведение: ОмГУ



(IMG:style_emoticons/default/thumbsup.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Matadora
сообщение 17.9.2010, 6:10
Сообщение #15


Школьник
*

Группа: Продвинутые
Сообщений: 16
Регистрация: 4.9.2010
Город: Ukraine
Учебное заведение: ВНТУ
Вы: студент



знаете как радовалась когда начала работать? ахаха, уйма эмоций Х)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 25.4.2024, 19:59

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru