Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2010, 23:00   #1
Angriff
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 14
По умолчанию Реализация стека на С

Доброго времени суток...помогите пожалуйста с проблемкой...нужно реализовать стек на С... да даже проблема не в этом... проблема с тек как правильно объявить структуры... вообщем вот код сишника и хедера...подскажите что нужно исправить чтобы было правильно....
1.с
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "1.h"

struct id {
    STACK * first;
    STACK * last;
    int num;
    int depth;
};

struct st {
    int number;
    struct st * last;
    struct STACKID * ptr;
} ;


STACKID * create(int MAX_D)
{
    STACKID * ptr;
    STACK * pt;
    pt = malloc(sizeof(STACK));
    ptr = malloc(sizeof(STACKID));
    (*pt).ptr = ptr;
    (*pt).number = 0;
    (*pt).last = NULL;
    (*ptr).depth = MAX_D;
    (*ptr).num = 0;
    (*ptr).last = pt;
    (*ptr).first = pt;
    return ptr;
}

STACKID * push(STACKID * ptr, int a)
{
    STACK * pt;
    if ((*ptr).num = 0) {
	pt = (*ptr).last;
	(*pt).number = a;
	(*ptr).num += 1;
	return ptr;
    }
    if ((*ptr).num >= (*ptr).depth)
	return 0;
    else {
	STACK * pt;
	pt = malloc(sizeof(STACK));
	(*pt).last = (*ptr).last;
	(*pt).number = a;
	(*pt).ptr = ptr;
	(*ptr).num += 1;
	(*ptr).last = pt;
	return ptr;
    }
}

STACKID * pop(STACKID * ptr)
{
    STACK * pt;
    if ((*ptr).num = 0) 
	return 0;
    if ((*ptr).num = 1) {
	pt= (*ptr).last;
	(*pt).number = 0;
	return ptr;
    }
    STACK * pointer;
    pointer = (*ptr).last;
    pt = (*pointer).last;
    (*ptr).last = pt;
    (*ptr).num --;
    free(pointer);
    return ptr;
}

int del(STACKID * ptr)
{
    while ((*ptr).num != 0){
	pop(ptr);
    }
    free((*ptr).first);
    free(ptr);
    return 1;
}
[/HTML]

1.h

[HTML]
typedef struct STACK;
typedef struct STACKID;

STACKID * create(int MAX_D);

STACKID * pop(STACKID * ptr, int a);

STACKID * push(STACKID * ptr);

int del(STACKID * ptr);
Заранее спасибо!

Последний раз редактировалось Stilet; 01.03.2010 в 08:50.
Angriff вне форума Ответить с цитированием
Старый 28.02.2010, 23:07   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

что компилятор выдает то?
NiCola999 вне форума Ответить с цитированием
Старый 28.02.2010, 23:10   #3
Angriff
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 14
По умолчанию

Код:
[Angriff@localhost struct]$ gcc 1.c -o 1
In file included from 1.c:4:
1.h:1: предупреждение: бесполезный спецификатор класса хранения в пустой декларации
1.h:2: предупреждение: бесполезный спецификатор класса хранения в пустой декларации
1.h:4: ошибка: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
1.h:6: ошибка: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
1.h:8: ошибка: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
1.h:10: ошибка: expected ‘)’ before ‘*’ token
1.c:7: ошибка: expected specifier-qualifier-list before ‘STACK’
1.c:20: ошибка: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
1.c:36: ошибка: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
1.c:59: ошибка: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
1.c:78: ошибка: expected ‘)’ before ‘*’ token
[Angriff@localhost struct]$

Последний раз редактировалось Angriff; 28.02.2010 в 23:13.
Angriff вне форума Ответить с цитированием
Старый 28.02.2010, 23:19   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ну для начала в h файл надо дописать прагму
Код:
#pragma once
typedef struct STACK;
typedef struct STACKID;
STACKID * create(int MAX_D);
STACKID * pop(STACKID * ptr, int a);
STACKID * push(STACKID * ptr);
int del(STACKID * ptr);
либо можно так:
Код:
#ifndef 1_H
#define 1_H
typedef struct STACK;
typedef struct STACKID;
STACKID * create(int MAX_D);
STACKID * pop(STACKID * ptr, int a);
STACKID * push(STACKID * ptr);
int del(STACKID * ptr);
#endif

Последний раз редактировалось NiCola999; 28.02.2010 в 23:21.
NiCola999 вне форума Ответить с цитированием
Старый 28.02.2010, 23:32   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

не понятно из чего состоят структуры STACKID и STACK
Код:
typedef struct STACK;
typedef struct STACKID;
а где описание их структуры?
NiCola999 вне форума Ответить с цитированием
Старый 28.02.2010, 23:36   #6
Angriff
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 14
По умолчанию

NiCola999:
описание структуры в 1.с...но спрашиваю, как правильно сделать...может быть их куда то не туда нужно поместить...
и кстати, а под линукс пишу, там вроде не надо pragma
Angriff вне форума Ответить с цитированием
Старый 28.02.2010, 23:41   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

у вас в 1.c файле только функции которые возвращают тип STACKID и STACK, сами структуры обьявлены под другими именами я полагаю

Код:
struct id {
    STACK * first;
    STACK * last;
    int num;
    int depth;
};

struct st {
    int number;
    struct st * last;
    struct STACKID * ptr;
} ;
NiCola999 вне форума Ответить с цитированием
Старый 28.02.2010, 23:44   #8
Angriff
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 14
По умолчанию

да......а как их правильно объявить? не подскажите??
Angriff вне форума Ответить с цитированием
Старый 28.02.2010, 23:46   #9
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Объявляйте в хедере структуры и не парьтесь:
Код:
typedef struct _STACK
{
...
} STACK;

typedef struct _STACKID
{
...
} STACKID;
К тому же так описывать нельзя:
typedef struct STACK;
Хотя бы так:
typedef struct STACK STACK1;
Carbon вне форума Ответить с цитированием
Старый 28.02.2010, 23:49   #10
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

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

1.h
Код:
#pragma once //  в Linux помоему тоже нужна
typedef struct stID {
    struct stID * first;
    struct stID * last;
    int num;
    int depth;
}STACKID;

typedef struct stack {
    int number;
    struct stack * last;
    struct stack * ptr;
}STACK ;

STACKID * create(int MAX_D);
STACKID * pop(STACKID * ptr, int a);
STACKID * push(STACKID * ptr);
int del(STACKID * ptr);
1.c
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "1.h"




STACKID * create(int MAX_D)
{
    STACKID * ptr;
    STACK * pt;
    pt = malloc(sizeof(STACK));
    ptr = malloc(sizeof(STACKID));
    (*pt).ptr = ptr;
    (*pt).number = 0;
    (*pt).last = NULL;
    (*ptr).depth = MAX_D;
    (*ptr).num = 0;
    (*ptr).last = pt;
    (*ptr).first = pt;
    return ptr;
}
.......
итд
NiCola999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация стека в виде массива DOJ Общие вопросы C/C++ 0 29.09.2009 18:37
Реализация Стека MjRed Общие вопросы C/C++ 3 13.05.2009 12:18