前提
「アルゴ式」の問題で、出力例と私の出力が違っています。
出力例
4
1
3
Error
2
私の出力
0
4
1
3
3
https://algo-method.com/tasks/828
実現したいこと
可変長配列で配列の末尾に要素を追加(Push)と 配列の末尾を出力してから、配列の末尾を削除(Pop)するプログラムを作っています。配列に要素がない場合「Error」と表示します。
発生している問題・エラーメッセージ
エラーはないです。
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <stdint.h> 4 5typedef struct 6{ 7 int *array; 8 int capa; 9 int len; 10} DynamicIntArray; 11 12DynamicIntArray * 13DynamicIntArray_New(int n) 14{ 15 DynamicIntArray *self = calloc(1, sizeof(*self)); 16 if (!self) { 17 return NULL; 18 } 19 self->capa = n; 20 self->array = calloc(self->capa, sizeof(int)); 21 if (!self->array) { 22 free(self); 23 return NULL; 24 } 25 return self; 26} 27 28DynamicIntArray * 29DynamicIntArray_Resize(DynamicIntArray *self, int32_t capa) 30{ 31 int32_t byte = sizeof(int); 32 int32_t size = byte * capa; 33 int *tmp = realloc(self->array, size); 34 if (!tmp) { 35 return NULL; 36 } 37 self->array = tmp; 38 self->capa = capa; 39 return self; 40} 41 42DynamicIntArray * 43DynamicIntArray_PushBack(DynamicIntArray *self, int elem) 44{ 45 if (self->len >= self->capa) { 46 if (!DynamicIntArray_Resize(self, self->capa * 2)) { 47 return NULL; 48 } 49 } 50 self->array[self->len++] = elem; 51 return self; 52} 53 54/*DynamicIntArray_Removeのみ自身で追加。あとは既存のコードを少し改良しました。*/ 55DynamicIntArray * 56DynamicIntArray_Remove(DynamicIntArray *self) 57{ 58 59 return self->len--; 60} 61 62void DynamicIntArray_Del(DynamicIntArray *self) 63{ 64 if(!self) { 65 return; 66 } 67 free(self->array); 68 free(self); 69} 70 71void DynamicIntArray_Show(const DynamicIntArray *self) 72{ 73 printf("%d\n", self->array[self->len]); 74} 75 76int main(void) 77{ 78 int N; 79 (void)scanf("%d", &N); 80 81 DynamicIntArray *ary = DynamicIntArray_New(N); 82 83 int A[101]; 84 for (int i = 0; i < N; i++) { 85 (void)scanf("%d", &A[i]); 86 DynamicIntArray_PushBack(ary, A[i]); 87 } 88 89 int Q; 90 (void)scanf("%d", &Q); 91 for (int i = 0; i < Q; i++) { 92 int query; 93 (void)scanf("%d", &query); 94 if (query == 0) { 95 int v; 96 (void)scanf("%d", &v); 97 DynamicIntArray_PushBack(ary, v); 98 } else if (query == 1) { 99 int size = sizeof(DynamicIntArray) / sizeof(DynamicIntArray); 100 if (size > 0) { 101 DynamicIntArray_Show(ary); 102 DynamicIntArray_Remove(ary); 103 } else { 104 printf("Error\n"); 105 } 106 107 } 108 } 109 110 return 0; 111 112}
試したこと
DynamicIntArray *
DynamicIntArray_Remove()関数を自身で追加しました。
補足情報(FW/ツールのバージョンなど)
「アルゴ式」のオンラインでジャッジするところでコードを書きました。

回答1件
あなたの回答
tips
プレビュー