#include <stdio.h>
#include <stdlib.h>
typedef struct node_t
{
int value;
struct node_t* prev;
struct node_t* next;
} TNode;
typedef struct deque_t
{
TNode* left;
TNode* right;
} TDeque;
//----------------------------------------------------------------------------
TDeque* PushRight(TDeque* deque, int value)
{
TNode* node = malloc(sizeof(TNode));
node->value = value;
node->next = NULL;
node->prev = deque->right;
if (deque->left && deque->right)
{
deque->right->next = node;
deque->right = node;
}
else
{
deque->left = deque->right = node;
}
return deque;
}
//----------------------------------------------------------------------------
TDeque GetDeque(const int* begin, const int* end)
{
TDeque deque = {NULL, NULL};
for (; begin < end; ++begin)
{
PushRight(&deque, *begin);
}
return deque;
}
//----------------------------------------------------------------------------
long long GetCalculation(const TDeque* deque)
{
long long result = 1;
TNode* first = deque->left; // x1
TNode* second = first->next; // x2
TNode* last = deque->right; // xn
for (; second; first = second, second = second->next, last = last->prev)
{
// printf("%d %d %d\n", first->value, second->value, last->value);
result *= first->value + second->value + 2 * last->value;
}
return result;
}
//----------------------------------------------------------------------------
int main()
{
const int CArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
const size_t CArraySize = sizeof(CArray) / sizeof(*CArray);
TDeque deque = GetDeque(CArray, CArray + CArraySize);
printf("result = %lld\n", GetCalculation(&deque));
return 0;
}