#include <stdio.h>
#ifndef MaxLength
#define MaxLength 300
#endif
#ifndef ElementType
typedef int ElementType;
#endif
#ifndef Position
typedef int Position;
#endif
typedef struct
{
ElementType Elements[MaxLength];
Position Last;
} List;
void copyEvenNumbers(List list1, List *pL2);
int countList(ElementType x, List list);
void deleteList(Position p, List *pL);
void difference(List list1, List list2, List *pL);
int emptyList(List list);
Position endList(List list);
void erase(ElementType x, List *pL);
int fullList(List list);
Position first(List list);
float getAvg(List list);
void insertList(ElementType x, Position p, List *pL);
void insertSet(ElementType x, List *pL);
void intersection(List list1, List list2, List *pL);
Position locate(ElementType x, List list);
ElementType minList(List list);
void makenullList(List *pL);
int member(ElementType x, List list);
ElementType maxList(List list);
Position next(Position p, List L);
void normalize(List *pL);
Position previous(Position p, List L);
void printList(List L);
void printOddNumbers(List list);
ElementType retrieve(Position p, List list);
void removeAll(ElementType x, List *pL);
void readList(List *pL);
void readSet(List *pL);
ElementType sumList(List list);
void swap(ElementType array[], int i, int j);
void sort(List *pL);
void unionSet(List list1, List list2, List *pL);
void copyEvenNumbers(List list1, List *pL2)
{
pL2->Last = 0;
for (int i = 0; i < list1.Last; i++)
if (list1.Elements[i] % 2 == 0)
{
pL2->Elements[pL2->Last] = list1.Elements[i];
pL2->Last++;
}
}
int countList(ElementType x, List list)
{
int count = 0;
for (int i = 0; i < list.Last; i++)
if (list.Elements[i] == x)
count++;
return count;
}
void deleteList(Position p, List *pL)
{
if (p < first(*pL) || p >= endList(*pL))
{
printf("Vi tri khong hop le\n");
return;
}
for (Position i = p; i < pL->Last; i++)
pL->Elements[i - 1] = pL->Elements[i];
pL->Last--;
}
void difference(List list1, List list2, List *pL)
{
makenullList(pL);
for (int i = 0; i < list1.Last; i++)
if (!member(list1.Elements[i], list2))
insertSet(list1.Elements[i], pL);
}
int emptyList(List list)
{
return list.Last == 0;
}
Position endList(List list)
{
return list.Last + 1;
}
void erase(ElementType x, List *pL)
{
deleteList(locate(x, *pL), pL);
}
int fullList(List list)
{
return list.Last == MaxLength;
}
Position first(List list)
{
return 1;
}
float getAvg(List list)
{
if (list.Last == 0)
return -10000;
return (float)sumList(list) / list.Last;
}
void insertList(ElementType x, Position p, List *pL)
{
if (fullList(*pL))
return;
if (p < first(*pL) || p > endList(*pL) + 1)
return;
for (Position i = pL->Last; i >= p; i++)
pL->Elements[i] = pL->Elements[i - 1];
pL->Elements[p - 1] = x;
pL->Last++;
}
void insertSet(ElementType x, List *pL)
{
pL->Elements[pL->Last] = x;
pL->Last++;
}
void intersection(List list1, List list2, List *pL)
{
makenullList(pL);
for (int i = 0; i < list1.Last; i++)
if (member(list1.Elements[i], list2))
insertSet(list1.Elements[i], pL);
}
Position locate(ElementType x, List list)
{
for (int i = 1; i <= list.Last; i++)
if (x == retrieve(i, list))
return i;
return list.Last + 1;
}
ElementType minList(List list)
{
ElementType min = list.Elements[0];
for (int i = 0; i < list.Last; i++)
if (min > list.Elements[i])
min = list.Elements[i];
return min;
}
void makenullList(List *pL)
{
pL->Last = 0;
}
int member(ElementType x, List list)
{
for (int i = 1; i <= list.Last; i++)
if (x == retrieve(i, list))
return 1;
return 0;
}
ElementType maxList(List list)
{
ElementType max = list.Elements[0];
for (int i = 0; i < list.Last; i++)
if (max < list.Elements[i])
max = list.Elements[i];
return max;
}
Position next(Position p, List L)
{
if (p > L.Last)
return 0;
if (p == L.Last)
return endList(L);
return p + 1;
}
void normalize(List *pL)
{
for (int i = 0; i < pL->Last; i++)
for (int j = i + 1; j < pL->Last; j++)
if (pL->Elements[i] == pL->Elements[j])
{
deleteList(j + 1, pL);
j--;
}
}
Position previous(Position p, List L)
{
if (p <= first(L))
return 0;
return p - 1;
}
void printList(List L)
{
for (Position p = 1; p <= L.Last; p++)
printf("%d ", retrieve(p, L));
printf("\n");
}
void printOddNumbers(List list)
{
for (int i = 0; i < list.Last; i++)
if (!(list.Elements[i] % 2 == 0))
printf("%d ", list.Elements[i]);
printf("\n");
}
ElementType retrieve(Position p, List list)
{
if (!(p > list.Last))
return list.Elements[p - 1];
return 0;
}
void removeAll(ElementType x, List *pL)
{
while (member(x, *pL))
deleteList(locate(x, *pL), pL);
}
void readList(List *pL)
{
makenullList(pL);
int n, e;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &e);
insertList(e, pL->Last + 1, pL);
}
}
void readSet(List *pL)
{
readList(pL);
normalize(pL);
}
ElementType sumList(List list)
{
ElementType sum = 0;
for (int i = 0; i < list.Last; i++)
sum += list.Elements[i];
return sum;
}
void swap(ElementType array[], int i, int j)
{
ElementType temp = array[i];
array[i] = array[j];
array[j] = temp;
}
void sort(List *pL)
{
for (int i = 0; i < pL->Last; i++)
for (int j = i + 1; j < pL->Last; j++)
if (pL->Elements[i] > pL->Elements[j])
swap(pL->Elements, i, j);
}
void unionSet(List list1, List list2, List *pL)
{
makenullList(pL);
int i;
for (i = 0; i < list1.Last; i++)
insertSet(list1.Elements[i], pL);
for (i = 0; i < list2.Last; i++)
if (!member(list2.Elements[i], list1))
insertSet(list2.Elements[i], pL);
}