Добавить n элементов из массива xs в конец массива array - C (СИ)
Формулировка задачи:
void appendElements (Array, *array, int *xs, int n);
Добавляет n элементов из массива xs в конец массива array.
Пример. Исходный массив:
1 2 3 4 5
Вызов:
int xs[] = {6, 7, 8, 9};
int n = sizeof(xs) / sizeof(*xs);
appendElements(array, xs, n);
Результат:
1 2 3 4 5 6 7 8 9Решение задачи: «Добавить n элементов из массива xs в конец массива array»
textual
Листинг программы
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Array {
int *data;
int n;
} Array;
void* mymalloc (size_t size);
void* myrealloc (void *ptr, size_t size);
Array* newArray (int n);
Array* copyArray (const Array *array);
void destroyArray (Array *array);
Array* readArray (const char *str);
void pprintArray (const Array *array, const char *str);
void pprintLineArray (const Array *array);
void prependElements (Array *array, int *xs, int n);
void* myrealloc (void *ptr, size_t size) {
void *res = realloc(ptr, size);
if (res == NULL && size != 0) {
fprintf(stderr, "myrealloc: unable to allocate %zd bytes\n", size);
exit(EXIT_FAILURE);
}
return res;
}
void* mymalloc (size_t size) {
void *res = malloc(size);
if (res == NULL) {
fprintf(stderr, "mymalloc: unable to allocate %zd bytes\n ", size);
exit(EXIT_FAILURE);
}
return res;
}
Array* newArray (int n){
Array* array = (Array*)mymalloc(sizeof(*array));
array->n = n;
array->data = (int*)mymalloc(sizeof(*array->data)*n);
return array;
}
Array* copyArray (const Array *array) {
Array* arraycopy=newArray(array->n);
int* data = array->data;
int* datacopy = arraycopy->data;
int i,len=array->n;
for(i=0;i<len;i++) datacopy[i] = data[i];
return arraycopy;
}
void destroyArray (Array *array) {
free(array->data);
free(array);
}
Array* readArray (const char *str) {
Array *result = NULL;
int n;
printf("Enter size of %s: ", str);
if (scanf("%d", &n) != 1 || n < 0) {
fprintf(stderr, "readArray: input error reading %s\n", str);
destroyArray(result);
return NULL;
}
result = newArray(n);
int *data = result->data;
for (int i = 0; i < n; i++) {
if (scanf("%d", data + i) != 1) {
fprintf(stderr, "readArray: input error reading %s\n", str);
destroyArray(result);
return NULL;
}
}
return result;
}
void pprintArray (const Array *array, const char *str) {
const int *data = array->data;
int n = array->n;
for (int i = 0; i < n; i++) {
printf("%s[%d] = %d\n", str, i, data[i]);
}
}
void pprintLineArray (const Array *array) {
const int *data = array->data;
int n = array->n;
if (n > 0) {
printf("%d", data[0]);
}
for (int i = 1; i < n; i++) {
printf(" %d", data[i]);
}
if (n > 0) {
printf("\n");
}
}
void appendElements (Array *array, int *xs, int n) {
int i;
array->data=(int*)myrealloc(array->data,sizeof(int)*(array->n+n));
array->n+=n;
int l = array->n;
for(i=l+1;i<=n;i++) {
array->data[i]=array->data[i+n];
}
for(i=0;i<n;i++) {
array->data[i]=xs[i];
}
}
int main () {
Array *array = readArray("array");
if (array == NULL) {
printf("I don't want to play with you anymore!!!\n");
exit(EXIT_FAILURE);
}
pprintLineArray(array);
int app_E = 0;
printf("Enter size of app: ");
if (scanf("%d", &app_E) != 1 || app_E < 0) {
fprintf(stderr, "readArray: input error reading app_E\n");
exit(EXIT_FAILURE);
}
int app[app_E];
for (int i = 0; i<app_E; i++) app[i] = (i+1);
appendElements(array,app,app_E);
pprintLineArray(array);
destroyArray(array);
}
Объяснение кода листинга программы
В этом коде реализованы основные операции со строками в языке C:
- Создание нового массива с помощью функции
newArray(). - Чтение массива из стандартного ввода с помощью функции
readArray(). - Вывод содержимого массива с помощью функции
pprintArray(). - Добавление элементов в конец массива с помощью функции
appendElements(). - Вывод измененного массива с помощью функции
pprintLineArray(). - Уничтожение массива с помощью функции
destroyArray(). Код также включает функцииmymalloc()иmyrealloc(), которые являются безопасными аналогами стандартных функцийmalloc()иrealloc(), и обеспечивают обработку ошибок. Синтаксис кода соответствует стандарту C99, и он совместим с компиляторами, поддерживающими этот стандарт.