Двунаправленные списки

Задание№2
N-натуральных чисел являються элементами двунаправленного списка L, вычислить:X1*Xn+X2*Xn-1+...+Xn*X1. Двунаправленные списки (см. "Сборник задач для начинающего программиста")

Алгоритм:
1)Создаём структуру.
2)Формируем список целых чисел.
3)Продвигаемся по списку:
от начала к концу в одном цикле,от конца к началу в другом цикле и перемножаем данные, содержащиеся в соответствующих элементах списка.
4)Суммируем полученные результаты.
5)Выводим на печать

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
 typedef struct list_elem {	//структура - элемент списка
 
      int date;			//полe данных 
 
      struct list_elem *next,*pred;	//указатели адресов  предыдущего и следующего элементов списка
 
  } SPK;    		   	
 
 
 
 
  SPK* NewElem (SPK *pnev);	//функция присоединения нового элемента списка 
 
  void PrintList(void);		//функция вывода списка на печать
 
  void ITOG(void);		//функция нахождения суммы произведений элементов
 
  SPK *list_start,*list_end;	//адреса первого и последнего элементов списка
 
 
 int main()
 
{
 
  clrscr();
 
    int N;
 
  printf("\nInput size of the list: ");
 
  scanf("%d",&N);
 
  SPK *end=NULL;		//указатель адреса последнего элемента
 
  printf("\nINPUT DATE:");
 
  do{			//цикл формирования списка
     end=NewElem(end);
 
     if(end==NULL)
 
       break;
 
    N--;
 
   } while(N > 0);
 
   printf("\n\n\nOur List: ");
 
   PrintList();
 
   ITOG();
 
   getch();
 
 
 return 0;
 
}
 
   SPK* NewElem (SPK *lel)
 
   {
 
    static int num=1;		//номер вводимого элемента
 
       lel=(SPK*)malloc(sizeof(SPK));	//выделение памяти для элемента списка
 
    printf("\n%d element: ",num);
 
    printf("\tInput date: ");
 
    scanf("%d",&lel->date);	//ввод числа
 
 
      fflush(stdin);		//очищение буфера ввода
 
 
	  if(list_start==NULL)	//если список пуст, то
 
	     {
	      lel->next=lel->pred=NULL;	//поля адресов равны 0
 
	      list_start=list_end=lel;		//элемент  становится единственным в списке
 
	     }
 
	  else
 
	  {
 
	      list_end->next=lel;	//указатель последнего элемента указывает на присоединяемый элемент
 
	      lel->pred=list_end;	//указатель присоединяемого элемента указывает на последний элемент
 
	      lel->next=NULL;
 
	      list_end=lel;	//присоединенный элемент становится последним в списке
 
        }
 
    num++;
 
    return lel;
 }
 
   void PrintList()
 
     {
      SPK *lel=list_start;	
 
      while(lel!=NULL)			//пока не найден последний элемент списка
 
	{
	  printf("%4d",lel->date);		
 
	  lel=lel->next;		//передвигаем указатель на следующий элемент
	}
      }
 
     void ITOG(void)
 
     {
	SPK *lel=list_start;		
 
	SPK *mel=list_end;		
 
	int mltp,itog=0;
 
      while(lel!=NULL)
 
     {
       mltp=(lel->date)*(mel->date);		//умножение элементов 
 
       printf("\n\n%d * %d = %d",lel->date,mel->date,mltp);	
 
       itog=itog+mltp;			//суммирование произведений 
 
       lel=lel->next;			//идем по списку из первого элемента в последний
 
      mel=mel->pred;			//идем по списку из последнего элемента в первый
 
      }
 
     printf("\n\nITOG = %d",itog);
    }

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