1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
#include <cstdlib>
#include <cstdio>
#include <cmath>
struct MyIntArr {
int * p;
int capacity;
int size;
};
MyIntArr* clear(MyIntArr* const mia);
MyIntArr* doubleIntArr(MyIntArr* const mia);
MyIntArr* initMyIntArr(MyIntArr* const mia);
MyIntArr* pushBack(MyIntArr* const mia, int val);
MyIntArr* setCapacity(MyIntArr* mia, int val);
int* copyIntArr(int* const lhs, int lhs_size, int* const rhs);
void destroyIntArr(int* p);
MyIntArr toBase(int num, int to);
int main()
{
MyIntArr a = toBase(3033, 7);
for ( int i = 0; i < a.size; ++i ) {
printf("%d ", a.p[i]);
}
printf("%c", '\n');
destroyIntArr(a.p);
return 0;
}
MyIntArr* clear(MyIntArr* const mia)
{
setCapacity(mia, 0);
return mia;
}
MyIntArr* doubleIntArr(MyIntArr* const mia)
{
int new_cap = mia->capacity ? mia->capacity * 2 : 1;
setCapacity(mia, new_cap);
return mia;
}
MyIntArr* initMyIntArr(MyIntArr* const mia)
{
mia->capacity = 0;
mia->size = 0;
mia->p = nullptr;
return mia;
}
MyIntArr* pushBack(MyIntArr* const mia, int val)
{
if ( mia->size == mia->capacity ) {
doubleIntArr(mia);
}
mia->p[mia->size] = val;
++mia->size;
return mia;
}
MyIntArr* setCapacity(MyIntArr* mia, int val)
{
if ( val < 0 ) { return mia; } // reject
if ( val == 0 ) {
if ( mia->capacity == 0 ) {
return mia;
}
destroyIntArr(mia->p);
mia->capacity = 0;
mia->size = 0;
return mia;
}
// val > 0
if ( mia->capacity == 0 ) {
// NO need to copy anything:
mia->p = (int*)std::calloc( val, sizeof(int) );
mia->capacity = val;
return mia;
}
int * p = (int*)std::calloc( val, sizeof(int) );
if ( val < mia->size ) {
mia->size = val;
}
copyIntArr(mia->p, mia->size, p);
mia->capacity = val;
std::free( mia->p );
mia->p = p;
return mia;
}
int* copyIntArr(int* const lhs, int lhs_size, int* const rhs)
{
for ( int i = 0; i < lhs_size; ++i ) {
rhs[i] = lhs[i];
}
return rhs;
}
void destroyIntArr(int* p)
{
std::free( p );
p = nullptr;
}
MyIntArr toBase(int num, int to)
{
MyIntArr mia;
initMyIntArr( &mia );
int num_length = static_cast<int>( std::log10(num) ) + 1;
for (int i = 0; i < num_length; ++i) {
pushBack( &mia, num % to );
num /= to;
}
return mia;
}
|