Impl working c_impl solution

This commit is contained in:
Stephen Seo 2020-12-06 18:34:46 +09:00
parent d59d747678
commit 9984f34f57
2 changed files with 111 additions and 1 deletions

View file

@ -1,4 +1,4 @@
COMMON_FLAGS = -Wall -Wextra -Wpedantic
COMMON_FLAGS = -std=gnu11 -Wall -Wextra -Wpedantic
ifdef DEBUG
CFLAGS = $(COMMON_FLAGS) -O0 -g

View file

@ -1,3 +1,113 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INIT_SPLIT_LIST_SIZE 8
#define INIT_INPUT_LIST_SIZE 8
#define INIT_OUTPUT_LIST_SIZE 8
void print_help() {
puts("./program <comma_separated_split_list> <comma_separtaed_input_list>");
}
void print_l(unsigned int size, int *list) {
for(unsigned int i = 0; i < size; ++i) {
printf("%d ", list[i]);
}
printf("\n");
}
void push_l(unsigned int *size, unsigned int *capacity, int **list, int new) {
if(*size == *capacity) {
int *new_list = (int*)malloc(*capacity * sizeof(int) * 2);
memcpy(new_list, *list, *capacity * sizeof(int));
free(*list);
*list = new_list;
*capacity = *capacity * 2;
}
(*list)[*size] = new;
*size = *size + 1;
}
int main(int argc, char **argv) {
if(argc != 3) {
puts("ERROR: Requires two arguments:");
print_help();
return 1;
}
unsigned int sl_size = 0;
unsigned int sl_capacity = INIT_SPLIT_LIST_SIZE;
int *split_list = (int*)malloc(sl_capacity * sizeof(int));
unsigned int il_size = 0;
unsigned int il_capacity = INIT_INPUT_LIST_SIZE;
int *input_list = (int*)malloc(il_capacity * sizeof(int));
int temp = 0;
for(unsigned int i = 0; argv[1][i] != 0; ++i) {
if(argv[1][i] != ',') {
temp = temp * 10 + (int)(argv[1][i] - '0');
} else {
push_l(&sl_size, &sl_capacity, &split_list, temp);
temp = 0;
}
}
push_l(&sl_size, &sl_capacity, &split_list, temp);
temp = 0;
for(unsigned int i = 0; argv[2][i] != 0; ++i) {
if(argv[2][i] != ',') {
temp = temp * 10 + (int)(argv[2][i] - '0');
} else {
push_l(&il_size, &il_capacity, &input_list, temp);
temp = 0;
}
}
push_l(&il_size, &il_capacity, &input_list, temp);
puts("Got input:");
print_l(sl_size, split_list);
print_l(il_size, input_list);
unsigned int *out_sizes = (unsigned int*)calloc(
sl_size, sizeof(unsigned int));
unsigned int *out_capacities = (unsigned int*)malloc(
sl_size * sizeof(unsigned int));
for(unsigned int i = 0; i < sl_size; ++i) {
out_capacities[i] = INIT_OUTPUT_LIST_SIZE;
}
int **out_lists = (int**)malloc(
sl_size * sizeof(int*));
for(unsigned int i = 0; i < sl_size; ++i) {
out_lists[i] = (int*)malloc(
INIT_OUTPUT_LIST_SIZE * sizeof(int));
}
unsigned int il_idx = 0;
for(unsigned int i = 0; i < sl_size; ++i) {
for(unsigned int j = 0; j < split_list[i]; ++j) {
if(il_idx >= il_size) {
} else {
push_l(out_sizes + i, out_capacities + i, out_lists + i,
input_list[il_idx++]);
}
}
}
puts("Output lists:");
for(unsigned int i = 0; i < sl_size; ++i) {
print_l(out_sizes[i], out_lists[i]);
}
free(split_list);
free(input_list);
free(out_sizes);
free(out_capacities);
for(unsigned int i = 0; i < sl_size; ++i) {
free(out_lists[i]);
}
free(out_lists);
return 0;
}