После игры в домино остался ряд камней. Используя дву¬направленный список, определить, правильно ли расположены камни домино. Алгоритм: 1) Создаем двунаправленный список void main() #include <stdio.h> #include <stdlib.h> # define lsize 5 typedef struct DNODE node;//структура ячейка typedef struct DLIST list;//структура список struct DNODE{ int left_side, //значение левой стороный right_side;//значение правой стороны node *left,//ячейка слева *right;//ячейка справа }; struct DLIST{ int size,// максимальный размер списка count;// текущий размер (текущее кол-во элементов) node *head,// первая ячейка *tail;// последняя ячейка }; void init_list (list * l, int LIST_SIZE){// функция создают список входящиеаргументы: адрес первого элемента списка, максимальный размер l->count = 0;// текущие кол-во элементов =0 l->size=LIST_SIZE;// указываем списку его максимальный размер l->head=l->tail=NULL;//т.к. список пуст первый элемент равен последнему } void append_to_right (list *l, node *h){//функция доюавляем элемент h в список l справа, то есть в конец h->right = h->left = NULL;//обрезаем указатели на другие ячейки if (l->count==0){// если список пуст l->head=l->tail=h;//элемент явл и головой и хвостом } else{ h->left=l->tail;//элемент слева = хвост l->tail->right=h;//элемент справа от хвоста = h l->tail = h;//наш элемент стал последним } l->count++;//увеличили счётчик элементов } node * read_from_head (list *l)//функция счтывает самый левый элемент { node *n = NULL; n=l->head; return n; } int main(){ list lt;// создаём список node *nd;// создаём отдельную ячейку int ls,// значение правой стороны кости домино rs,// значение левой стороны кости домино i;//переменая для цикла //строим кости //вычисляем кол-во оставшихся костей init_list(<, lsize);// инициализация списка printf(" vvedite kosti %d: \n ", lsize); // вводим значения ост костей for(i=0;i < lsize; i++){ nd = (node *) malloc(sizeof(node));//создаём scanf ("%d:%d", &ls, &rs);// считываем кости с клавиатуры nd->left_side = ls;//записываем считаные даные nd->right_side = rs;//записываем считаные даные nd->left = nd->right = NULL;//обрезаем переменую append_to_right(<,nd);//добавляем новую кость в конец цепи } //проверка на комбинацию nd=read_from_head(<);//считываем первый илемент for (i=0;i<(lt.count)-1;i++){//идём до конца списка слева направо if (nd->right_side != nd->right->left_side){//если правое значение левой кости не равно левому значению правой кости printf(" кости расположены не правильно"); break;} nd=nd->right;//иначе идём дальше } if (i==lt.count-1) printf(" кости расположены правильно "); return 0; }
Ключевые слова:
домино, двунаправленный список
|
|||||||