IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Стек, Язык Си
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Реализована программа для работы с динамическим стеком. Реализованы функции:
1. создания пустого стека,
2. проверки стека на пустоту,
3. добавления элемента в стек,
4. извлечение элемента из стека,
5. уничтожения стека.

#include<stdlib.h>;
#include<stdio.h>;
#include<conio.h>;

struct elem
{ int data;
struct elem* next;
};
typedef struct elem elem;

inline void newstack(elem* pup){pup=NULL;};

inline int isempty(elem* pup){return pup==NULL;};

inline void add(elem* pup, int x)
{ elem* qp;
if(isempty(pup)==1)
{ qp=(elem*)malloc(sizeof(elem));
pup=qp;
qp->data=x;
}
else
{ qp=(elem*)malloc(sizeof(elem));
qp->next=pup;
qp->data=x;
pup=qp;
};
};

inline int toget(elem* pup)
{ elem* qp;
int y;
if(isempty(pup)) return 0;
else
{ qp=pup;
pup=pup->next;
y=qp->data;
free(qp);
};
return y;
};

void kill(elem* pup)
{ elem* qp;
if (isempty(pup)==1) return;
while(pup!=NULL)
{ qp=pup;
pup=pup->next;
free(qp);
};
};

void main()
{ int i;
elem* pup;
clrscr();
newstack(pup);
printf("%d",isempty(pup));
add(pup,5);
printf("%d",isempty(pup));
kill(pup);
}


Вылетает сразу же при запуске, в чем причина?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
в чем причина?
Для того, чтобы изменить значение указателя в функции, и оно стало доступно в вызывающей программе, надо передавать в функцию указатель на указатель... Вот так должна выглядеть функция newstack (add тоже придется изменить, там тоже должно меняться значение pup):
inline void newstack(elem** pup) {
*pup = NULL;
}
Вызывать теперь вот так:

newstack(&pup);

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


А какая-нибудь другая реализация этих функций существует?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Что значит "другая"? Как реализуешь - так и будет... То что ты начал делать - тоже вполне можно привести к работоспособному виду...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 8.12.2007 18:50) *

Для того, чтобы изменить значение указателя в функции, и оно стало доступно в вызывающей программе, надо передавать в функцию указатель на указатель... Вот так должна выглядеть функция newstack (add тоже придется изменить, там тоже должно меняться значение pup):
inline void newstack(elem** pup) {
*pup = NULL;
}
Вызывать теперь вот так:

newstack(&pup);


А почему необходимо использовать именно указатель на указатель и именно в этих функциях?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Я же написал: потому что указатель внутри ЭТИХ функций меняется, ты же в Паскале должен передавать параметр "по ссылке" (через Var), чтобы изменить его для внешней программы? В С++ можно было бы тоже передать по ссылке (через &), но поскольку ты пользуешься чистым С - там нет ссылок, приходится пользоваться указателем на параметр... Поскольку сам параметр - это "указатель на elem", то надо для его изменения пользоваться указателем на "указатель на elem".
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот я переделал:

#include<stdlib.h>
#include<conio.h>
#include<stdio.h>

typedef int type;

struct _elem
{

type val;
struct _elem *next;

};

typedef struct _elem elem;

void TOcreate(elem **pelem)
{
*pelem=NULL;
};

int empty(elem *pelem)
{
return (!(*pelem));
};

void TOkill(elem *pelem)
{
elem *temp;
if (empty(pelem)) return;
while (pelem!=NULL)
{
temp=pelem;
pelem=pelem->next;
free(temp);
}
}

void TOadd(elem **pelem, int datain);
{ elem *temp;
if (empty(pelem))
{
temp=(elem*)malloc(sixeof(elem));
*pelem=temp;
}
else
{
temp=(elem*)malloc(sizeof(elem));
temp->next=*pelem;
temp-)val=datain;

};

};

int TOpushElem(elem *pelem)
{
int dataoff;
elem *temp;
if (empty(pelem)==NULL) return 0;
else
{
temp=pelem;
pelem=pelem->next;
dataoff=temp->val;
free(temp);
};
return dataoff;
};

int main()
{
elem *pelem;
TOcreate(&pelem);
TOadd(&pelem,7);

return 0;
}


только теперь походу функция empty неправильно реализована, в чем косяк?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Смотри:
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>

typedef int type;

typedef struct _elem {
type val;
struct _elem *next;
} elem;

void TOcreate(elem **pelem) {
*pelem = NULL;
};

int empty(elem *pelem) {
return (!pelem); /* Проверять на NULL надо не то, куда указывает pelem, а его самого */
};

void TOkill(elem *pelem) {
elem *temp;
if(empty(pelem)) return;

while (pelem) {
temp=pelem;
pelem=pelem->next;
free(temp);
}
}

void TOadd(elem **pelem, int datain) { /* После заголовка не должно быть точки с запятой */
elem *temp;
if (empty(*pelem)) {
temp=(elem*)malloc(sizeof(elem));
*pelem=temp;
}
else {
temp=(elem*)malloc(sizeof(elem));
temp->next=*pelem;
temp->val=datain;
};
};

int TOpushElem(elem *pelem) {
int dataoff;
elem *temp;
if(empty(pelem)) return 0; /* Ты пытался сравнить целое с указателем - не надо этого делать */
else {
temp=pelem;
pelem=pelem->next;
dataoff=temp->val;
free(temp);
}
return dataoff;
}

int main() {
elem *pelem;
TOcreate(&pelem);
TOadd(&pelem,7);
return 0;
}

Ну, и следи за синтаксическими ошибками... sixeof вместо sizeof - ты копируй то, что проверяешь, а не набирай здесь... А то вносишь лишние ошибки...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


вот ещё функцию вывода решил добавить:

void TOshow(elem *pelem)
{ elem *temp;
int data;

while(pelem!=NULL)
{
temp=pelem;
pelem=pelem->next;
data=temp->val;
printf("%d",data);

};
};


но она выводит совершенно непредсказуемый результат

Сообщение отредактировано: Rocket -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Так а как корректно реализовать функцию вывода элементов стека на экран?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Проблема в функции TOadd... Вот так она работает:
void TOadd(elem **pelem, int datain) {
elem *temp;

temp=(elem*)malloc(sizeof(elem));
temp->val=datain;
temp->next=NULL;
if (!empty(*pelem)) {
temp->next=*pelem;
}
*pelem=temp;
}
А сама функция вывода на экран -

void TOshow(elem *pelem) {

for(; pelem; pelem = pelem->next) {
printf("%d ", pelem->val);
}
printf("\n");
}

P.S. Больше на твои вопросы я отвечать не буду. Я тебе написал, что не надо ставить точки с запятой где попало? Ты с удивительным упорством продолжаешь их ставить; ну, так продолжай... Без меня...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Сам с себя угораю... для какой цели понаставил ; почти после каждой } , понять не могу...
P.S. ну а если вернуться к проге, то в функциях извлечения елемента и удаления стека тоже какие-то непонятные и неведомые косяки... unsure.gif

А, ну всё встало на свои места. Изменил как и в добавление.

Сообщение отредактировано: Rocket -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


Привет Rocket!!! А ты не мог выложить здесь файл с этой прогой со стэком? буду очень признателен))))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(Flanker @ 10.12.2007 17:04) *

Привет Rocket!!! А ты не мог выложить здесь файл с этой прогой со стэком? буду очень признателен))))

Держи!


Прикрепленные файлы
Прикрепленный файл  Lab12.CPP ( 1.25 килобайт ) Кол-во скачиваний: 151
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 6.12.2020 5:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name