Проверка расположения элементов в двунаправленном списке

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

Алгоритм:

1) Создаем двунаправленный список
2) Запрашиваем у пользователя элементы
3) Сравниваем полученные элементы
4) Если найдены элементы,удовлетворяющие условию,выводим
"кости расположены правильно" иначе " кости расположены не правильно"

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(&lt, 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(&lt,nd);//добавляем новую кость в конец цепи
  }
   //проверка на комбинацию
    nd=read_from_head(&lt);//считываем первый илемент
    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;
}

Ключевые слова: 
домино, двунаправленный список
ВложениеРазмер
DubleWayList.rar8.39 кб