Задача №12. После игры в домино остался ряд камней. Используя двунаправленный список, определить, правильно ли расположены камни домино. Двунаправленные списки. (см. "Сборник задач для начинающего программиста") Алгоритм: #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----------- "); }
Ключевые слова:
двунаправленный список, структурная переменная, проверка условия
|
|||