Advertisement
STANAANDREY

exam p1 pb1

Feb 2nd, 2023
887
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #define STEP 128
  5.  
  6. void checkAlloc(void *p) {
  7.   if (p == NULL) {
  8.     exit(-1);
  9.   }
  10. }
  11.  
  12. typedef struct {
  13.   int len, resMem, *at;
  14. } DynArr;
  15.  
  16. DynArr mkArr(int ini) {
  17.   assert(ini >= 0);
  18.   DynArr arr = {ini, ini, NULL};
  19.   if (ini) {
  20.     arr.at = calloc(sizeof(int), ini);
  21.     checkAlloc(arr.at);
  22.   }
  23.   return arr;
  24. }
  25.  
  26. void addToArr(DynArr *arr, int x) {
  27.   if (arr->len == arr->resMem) {
  28.     arr->resMem += STEP;
  29.     arr->at = realloc(arr->at, sizeof(int) * arr->resMem);
  30.     checkAlloc(arr->at);
  31.   }
  32.   arr->at[(arr->len)++] = x;
  33. }
  34.  
  35. DynArr readArr(int *n) {
  36.   scanf("%d", n);
  37.   DynArr arr = mkArr(*n);
  38.   for (int i = 0; i < *n; i++) {
  39.     scanf("%d", &(arr.at[i]));
  40.   }
  41.   return arr;
  42. }
  43.  
  44. void printArr(const DynArr *const arr) {
  45.   for (int i = 0; i < arr->len; i++) {
  46.     printf("%d ", arr->at[i]);
  47.   }
  48.   puts("");
  49. }
  50.  
  51. int cond(int x) {
  52.   return x & 1;
  53. }
  54.  
  55. DynArr intercl(DynArr a, DynArr b) {
  56.   int i = 0, j = 0;
  57.   DynArr res = mkArr(0);
  58.   while (i < a.len && j < b.len) {
  59.     int newElem;
  60.     if (a.at[i] == b.at[j]) {
  61.       newElem = a.at[i];
  62.       i++, j++;
  63.     } else if (a.at[i] < b.at[j]) {
  64.       newElem = a.at[i];
  65.       i++;
  66.     } else {
  67.       newElem = b.at[j];
  68.       j++;
  69.     }
  70.     if (cond(newElem) && (!res.len || res.at[res.len - 1] != newElem)) {
  71.       addToArr(&res, newElem);
  72.     }
  73.   }
  74.   for (;i < a.len; i++) {
  75.     if (cond(a.at[i]) && (!res.len || res.at[res.len - 1] != a.at[i])) {
  76.       addToArr(&res, a.at[i]);
  77.     }
  78.   }
  79.   for (;j < b.len; j++) {
  80.     if (cond(b.at[j]) && (!res.len || res.at[res.len - 1] != b.at[j])) {
  81.       addToArr(&res, b.at[j]);
  82.     }
  83.   }
  84.   return res;
  85. }
  86.  
  87. int main(void) {
  88.   int n, m;
  89.   DynArr a = readArr(&n);
  90.   DynArr b = readArr(&m);
  91.   DynArr res = intercl(a, b);
  92.   printArr(&res);
  93.   free(a.at);
  94.   free(b.at);//*/
  95.   free(res.at);
  96.   return 0;
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement