課題で困っています。いっぱいになるとサイズが 2 倍になり、1/4 いっぱいになると半分になる、動的に成長するスタックを実装することになっています。私は完全な C の初心者であり、ポインターに慣れていないため、いくつかの例を調べました。これが私が思いついたコードです。
実際には警告なしで gcc でコンパイルされますが、実行しようとすると「セグメンテーション違反」が発生します。これはおそらく壊れたポインターに関係していることがわかりましたが、間違いは見られないので、誰かが私に指摘してくれるとうれしいです.
乾杯
# ifndef STACK_H
# define STACK_H
# include "stdlib.h"
typedef struct stack {
int *stack;
int used;
int size;
} stack;
stack* stck_construct() {
stack *stck;
stck->stack = (int *)malloc(10 * sizeof(int));
stck->used = 0;
stck->size = 10;
return stck;
}
void stck_destruct(stack *stck) {
stck->stack = 0;
stck->used = stck->size = 0;
free(stck);
}
int stck_push(stack *stck, int val) {
if (stck->used == stck->size) {
stck->size *= 2;
stck->stack = (int *)realloc(stck->stack, stck->size * sizeof(int));
}
stck->stack[stck->used] = val;
stck->used++;
return 1;
}
int stck_pop(stack *stck, int *val) {
*val = stck->stack[stck->used];
free(stck->stack);
stck->used--;
if (stck->used <= (stck->size)/4) {
if (stck->size <=40) stck->size = 10;
else stck->size /= 2;
stck->stack = (int *)realloc(stck->stack, stck->size * sizeof(int));
}
return 1;
}
int main(){
stack* test;
test=stck_construct();
int i; int out;
for (i =1; i<=10; i++)
stck_push(test, i);
for (i =1; i<=10; i++) {
stck_pop(test,&out);
printf("%i\n", out);
}
stck_destruct(test);
return 0;
}
# endif