Использование двунаправленного списка в задаче определения правильности расположения камней домино.

Задача №12. После игры в домино остался ряд камней. Используя двунаправленный список, определить, правильно ли расположены камни домино. Двунаправленные списки. (см. "Сборник задач для начинающего программиста")

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

#include <stdio.h>
#include <stdlib.h>
 
 typedef struct list_elem {	//структура - элемент списка
 
      int left;			//поля данных - числовое значение левой и правой половины камня домино
 
      int right;
 
      struct list_elem *next,*prev;	//указатели адресов  предыдущего и следующего элементов списка
 
  } LEL;    		   	//пользовательский тип структурной переменной
 
 
 
 
  LEL* AddElem (LEL *pnev);	//функция присоединения нового элемента списка (камня домино)
 
  void PrintList(void);		//функция вывода списка на печать
 
  void PoiskEnd(void);		//функция проверки правильности расположения камней
 
  LEL *list_beg,*list_end;		//адреса первого и последнего элементов списка
 
  int N;			//переменная, с помощью которой вводится размер списка (кол-во камней)
 
 
 int main()
 
{
 
  printf("\nINPUT QUANTITY OF THE STONES DOMINO: ");
 
  scanf("%d",&N);
 
  LEL *end=NULL;		//указатель адреса последнего элемента
 
  printf("\nINPUT DATE:");
 
  do{			//цикл формирования списка
     end=AddElem(end);
 
     if(end==NULL)
 
       break;
 
    N--;
 
   } while(N > 0);
 
   printf("\n\n\nSequence of the stone-domino: ");
 
   PrintList();
 
   PoiskEnd();
 
 
 return 0;
 
}
 
   LEL* AddElem (LEL *pel)
 
   {
 
    static int num=1;		//номер вводимого элемента
 
    char A;
 
    pel=(LEL*)malloc(sizeof(LEL));	//выделение памяти для элемента списка
 
    printf("\n%d element: ",num);
 
    printf("\tInput left half of the stone-domino: ");
 
    scanf("%d",&pel->left);	//ввод значения левой половины камня
 
    if(pel->left < 0 || pel->left > 6 )	  //если вводимые данные меньше 0 или больше 6, то - окончание ввода
 
      {
       free(pel);
 
       return NULL;
      }
 
 
 
    printf("\t\tInput right half of the stone-domino ");
 
    scanf("%d",&pel->right);	//ввод значения правой половины камня
 
    if(pel->right < 0 || pel->right > 6 )	//если вводимые данные меньше 0 или больше 6, то - окончание ввода 
 
 
      {
       free(pel);
 
       return NULL;
      }
 
      fflush(stdin);		//очищение буфера ввода
 
	  if(list_beg==NULL)	//если список пуст, то
 
	     {
	      pel->next=pel->prev=NULL;	//поля адресов равны 0
 
	      list_beg=list_end=pel;	//элемент  становится единственным в списке
 
	     }
 
	  else
 
	  {
   inv: printf("\nWhere to put the stone-domino - to the left or to the right?");
 
	printf("Press L or R: ");	 	
 
    	scanf("%c",&A);	// клавишами 'l' или 'r' указзываем куда положить камень - влево или вправо	
 
 
	     switch(A)		/* присоединяем новый камень - в начало или в конец уже 					     существующего ряда камней домино*/ 
 
	     {
 
	     case 'l':		//присоединение к началу списка
 
 
 
	      list_beg->prev=pel;	//указатель первого элемента указывает на присоединяемый элемент
 
	      pel->next=list_beg;	//указатель присоединяемого элемента указывает на первый элемент
 
	      pel->prev=NULL;
 
	      list_beg=pel;	//присоединенный элемент становится первым в списке
 
 
 
	      break;
 
 
 
	     case 'r':		//присоединение к концу списка
 
 
	      list_end->next=pel;	//указатель последнего элемента указывает на присоединяемый элемент
 
 
	      pel->prev=list_end;	//указатель присоединяемого элемента указывает на последний элемент
 
	      pel->next=NULL;
 
	      list_end=pel;	//присоединенный элемент становится последним в списке
 
 
 
	      break;
 
 
	    default: printf("Error! ");  goto inv;	//если нажата неправильная клавиша - повторный ввод
	  }
 
        }
 
    num++;
 
    return pel;
 }
 
   void PrintList()
 
     {
      LEL *pel=list_beg;	
 
      while(pel!=NULL)			//пока не найден последний элемент списка
 
	{
	  printf("   #%d  %d#   ",pel->left,pel->right);	// печатаем значения левой и правой сторон камня 
 
	  pel=pel->next;		//передвигаем указатель на следующий элемент
	}
      }
 
     void PoiskEnd(void)
 
     {
	LEL *pel=list_beg;
 
      while(pel!=NULL)
 
 
      {
	if(pel->next==NULL) break;	//если найден последний элемент списка - выход из цикла
 
 
	  if( (pel->next->left)!=(pel->right) )	/*если значение правой половины камня не равно значению левой 				   половины следующего камня*/  
 
	  {
	    printf("\n\n\tERROR! Invalid disposal of the stones");
 
	    printf("\n\t-------------------------------------");
 
	    exit(0);			//завершение работы программы
 
	  }
 
	   pel=pel->next;		//передвижение по элементам списка
 
       }
 
	   printf("\n\n\t\tNOT ERRORS!\n\t\t----------- ");
 
 
 
 
 
 
     }

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