![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Matadora |
![]()
Сообщение
#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 |
![]()
Сообщение
#2
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Хм... да много чего неправильного получается, давайте сначала начнём.
Насколько я понимаю, данные должны вводиться с клавиатуры.... Они нигде не вводятся, не генерируются, не хранятся в коде программы... end=PutInStack(end); - никогда не вернёт NULL, поскольку malloc вернёт NULL только когда не сможет выделить память))) Предлагаю исправить для начала схему генерирования нового элемента. Если специальность связана с программированием рекомендую сразу использовать стандартную терминологию: push - "запихнуть" в стек pop - "вытолкнуть". Да и с другими структурами данных в принципе то же самое. PS. ВНТУ - случаем, не Волынский университет? |
Matadora |
![]()
Сообщение
#3
|
Школьник ![]() Группа: Продвинутые Сообщений: 16 Регистрация: 4.9.2010 Город: Ukraine Учебное заведение: ВНТУ Вы: студент ![]() |
нет, не Волынский, а Винницкий Х)
спасибо за совет, сейчас поищу ифну про них и попробую еще раз |
Matadora |
![]()
Сообщение
#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 |
![]()
Сообщение
#5
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Это немножко другой стек... Стек на массиве. Статическая структура данных. В принципе тоже годится. Но, на мой взгляд, полезнее понять динамические структуры данных. То есть, когда ограничение на размер стека заранее неизвестно.
|
Vahappaday |
![]()
Сообщение
#6
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
об указателях понятие дали вам или нет?
просто без них ничего не объяснить... |
Matadora |
![]()
Сообщение
#7
|
Школьник ![]() Группа: Продвинутые Сообщений: 16 Регистрация: 4.9.2010 Город: Ukraine Учебное заведение: ВНТУ Вы: студент ![]() |
будете смеяться - нам ничего не дали, первые же дни, только задания, мол дерзай молодежь Х)
|
Vahappaday |
![]()
Сообщение
#8
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
1 курс?!!! ничего не объяснив, сказали писать на С? Реализовывать стэк?
А что такое стек понятно? |
julia_lisha |
![]()
Сообщение
#9
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 147 Регистрация: 19.12.2009 Из: Omsk Город: omsk Учебное заведение: ОмГУ ![]() |
да ну на 1 курсе в начале стеки))))) нееее))))))))
хотя если в универ после чего то, то могут и так поиздеваться( |
Matadora |
![]()
Сообщение
#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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#12
|
Школьник ![]() Группа: Продвинутые Сообщений: 16 Регистрация: 4.9.2010 Город: Ukraine Учебное заведение: ВНТУ Вы: студент ![]() |
спасибо за наводку, теперь-то я точно ее сделаю Х)
|
Matadora |
![]()
Сообщение
#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 |
![]()
Сообщение
#14
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 147 Регистрация: 19.12.2009 Из: Omsk Город: omsk Учебное заведение: ОмГУ ![]() |
|
Matadora |
![]()
Сообщение
#15
|
Школьник ![]() Группа: Продвинутые Сообщений: 16 Регистрация: 4.9.2010 Город: Ukraine Учебное заведение: ВНТУ Вы: студент ![]() |
знаете как радовалась когда начала работать? ахаха, уйма эмоций Х)
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 19:39 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru