Построение последовательности для ряда натуральных чисел

Для ряда натуральных чисел длиной N>2 представленного в виде списка, построить последовательность: A1+A3, A2+A4, . . . An-2+An.
Задача № 4 (Простые списки) (см. Сборник задач для начинающего программиста)

Алгоритм:
1. С помощью списка создаём ряд натуральных чисел.
а) создаем первый элемент списка;
б) записываем первое натуральное число в первый элемент списка;
в) создаем следующий элемент списка;
г) записываем очередное натуральное число в соответствующий элемент списка.
д) соединяем первый элемент со вторым и так далее..
2. Строим исходную последовательность A1+A3, A2+A4, . . . An-2+An.
а) заводим переменную для текущей суммы, которая будет являться элементом искомой последовательности;
б) заводим массив, куда запишем искомую последовательность;
в) по порядку берем каждый элемент натурального ряда до А(n-2) включительно и складываем с элементом А(n), до которого добираемся с помощью цикла, результат записываем в массив.
г) выводим массив с искомой последовательностью.

#include <iostream>
 
using std::cout;
using std::endl;
 
 
void makeList(int N); // создает ряд натуральных чисел от 1 до N посредством списка
void makeSequence(int N, int *ptr); // строит исходную последовательность A1+A3, A2+A4, . . . An-2+An
 
// список
struct List 
{
	int n; // здесь хранится натуральное число
	List* next; // ссылка на следующий элемент списка
} *start, *last; // указатели на начало и конец натурального ряда
 
 
 
int main()
{
	const int N = 10; // длина ряда натуральных чисел задается здесь
 
	start = NULL; // инициализируем указатель 
 
 
	int a[N]; // здесь будем хранить элементы искомой последовательности
	List *p, *p1; 
 
	makeList(N);
	makeSequence(N, a);
 
 
	p = start;
 
	cout << "Here is the natural sequence( N = " << N << " ): " << endl;
 
	// выводим ряд натуральных чисел
	while(p != NULL)
	{
		cout << (p->n) << " ";
		p = p -> next;
	}
	cout << endl;
 
 
	// освобождаем память
	while (p != NULL)
	{
		p1 = p -> next;
		delete p;
		p = p1;
	}
	// выводим искомую последовательность
 
	cout << "Required sequence: " << endl;
	for(int j = 0; j < N-2; j++)
		cout << a[j] << " ";
 
 
	return 0;
}
 
void makeList(int N)
{
   List* p;
 
   if( start == NULL)
   {
	   start = new List; // создаем первый элемент списка
	   start -> n = 1; // записываем первое натуральное число в первый элемент списка
	   start -> next = NULL;
	   last = start;
 
   }
 
   for(int i = 2; i <= N; i++) // начиная со 2го
   {
	   p = new List; // создаем следующий элемент списка
	   p -> n = i;  // записываем очередное натуральное число
	   p -> next = NULL;
	   last -> next = p; // соединяем первый элемент со вторым и так далее..
	   last = p; // теперь оба указателя указывают на один и тот же элемент
   }
 
}
 
void makeSequence(int N, int *ptr)
{
	List *p, *p2;
	int tmp; // сюда будем записывать A1+A3, A2+A4...
 
	p = start;
 
	for(int i = 1; i <= N; i++)
	{
		tmp = 0;
		tmp = p -> n; // записываем элемент А(n-2)
		p2 = p; 
		// посредством вспомагательного указателя доходим до элемента А(n)
		for (int k = 0; k < 2; k++)
		{
			if(p2 -> next == NULL) break; // check
 
			p2 = p2 -> next;
		}
 
		tmp += (p2 -> n); // складываем А(n-2) и А(n)
 
	        *ptr = tmp; // результат записываем в a[i]
		ptr++; // i++)
 
		if(p2 -> next == NULL) break; // check
 
		p = p -> next; // переходим к следующему элементу списка
    }
}

Ключевые слова: 
список, последовательность, перестановка, массив