2014-11-26 5 views
1

Я пытаюсь моделировать стек (толкание и внезапная значения в вершине стека) с помощью структур и динамического распределения памяти в C и я эту структуру:Изменение размера массива внутри структуры

... 
#define max 5 

typedef struct stack 
{ 
    int stk[max]; 
    int top; 
}STACK; 
... 

Я успешно смоделировал стек, но когда он достигнет своего максимального размера (стек заполнен), я хочу изменить значение max, чтобы продолжать добавлять (push) значения в начало стека. Другими словами, я просто хочу перераспределить максимальное значение в поле stk структуры, если это возможно.

Любое предложение приветствуется.

ответ

0

Как указано в [user694733], вы должны использовать динамическую память. Другой пример может быть:

typedef struct stack 
{ 
    int top; 
    int max; 
    int stk[]; 
}STACK; 

STACK *init_stack(int m){ 
    STACK *st = (STACK *)malloc(sizeof(STACK)+m*sizeof(int)); 
    st->top = 0; 
    st->max = m; 
    return st; 
} 

STACK *resize_stack(STACK *st, int m){ 
    if (m<=st->max){ 
     return st; /* Take sure do not kill old values */ 
    } 
    STACK *st = (STACK *)realloc(sizeof(STACK)+m*sizeof(int)); 
    st->max = m; 
    return st; 
} 

Теперь вы можете использовать эту функцию в вашей программе, как:

void main(void){ 
    STACK *st = init_stack(5); 
    .... do something bu you need more room.... 
    st = resize_stack(st,100); 
    ..... Now is small again ..... 
    st = resize_stack(st,5); 
} 

Позаботьтесь, чтобы каждый realloc вызова имеет линейную стоимость, и поэтому вы не можете использовать его, чтобы добавить только постоянное количество элементов: лучше использовать геометрическое расширение. Взгляните на http://en.wikipedia.org/wiki/Dynamic_array в качестве начальной точки для динамического массива.

3

Использование int stk[max]; не является распределением динамической памяти.

Вам нужно указать указатель int * stk; и инициализировать его malloc. Затем realloc, когда требуется больше памяти. И когда стек больше не нужен, отпустите его с помощью free.

0

Попробуйте так:

typedef struct stack 
{ 
    int *stk; 
    int top; 
} 

signed int array_resize(stack *s, size_t size) 
{ 
    if(!s) return -1; 

    s->stk = realloc(s->stk, size * sizeof(int)); 

    return 0; 
} 

Это перераспределяет пространство для массива целых чисел. Я не знаю, как еще это сделать.

Смежные вопросы