Основной класс это fal (функция алгебры логики):
Class fal{
public:
	minterm *mdnf; //массив элементов типа minterm
	intsize,param; //размер массива и число переменных в функции
	classTable;
	classRow;
	fal(); // конструктор по умолчанию
	fal(constAnsiStrings,intparam_);  // конструктор от строки коэффициентов и числа параметров
	fal(const Table &t,int param_);
	~fal(); // деструктор
	AnsiStringprint(); // метод для вывода функции на экран;
	intcount();// возвращает количество минтермов в функци
};

В классе fal используется класс minterm, который представляет минтерем:

classminterm {
public:
	inta[4]; // массив из 4-х элементов в котором каждый элемент это переменная (1-переменная, 0-переменная с отрицанием,-1 – отсутствие переменной)
	intsize;// количество переменных

	minterm();// конструктор по умолчанию
	minterm(intA,intB,intC,intD);//конструктор от четырех переменных
	void fill(int A,int B,int C,int D);//изменение минтерма
	bool operator == (const minterm &m);// перегрузка оператора равно
	booloperator != (constminterm&m);// перегрузка оператора неравно
	boolnot_void();// проверка на существование (не пустой ли он)
	bool include(const minterm &m);//не включает ли минтерм m
	int count_1();//подсчет единиц
	bool positions_coincide(const minterm &m);//совпадают ли позиции -1?
	bool can_be_united(const minterm &m);//могут ли быть склеены?
	void glue(const minterm &m); //склеиваание
	AnsiStringprint();// вывод
};

Таблица используемая в методе Куайна – Мак-Класки реализована классами Table (таблица)и Row (строка), находящимся в области видимости класса fal:
classRow
	{
	public:
		intindex;// уникальный индекс строки
		intindex_arr[8]; // массив индексов строк в таблице СДНФ которые включают эту строку;
		mintermm;// минтерм
		intn;// количество единиц в минтерме
		boolunited;// участвовали в склейке или нет
		Row();// конструктор
		Row(intindex_,mintermm_);// конструктор от индекса и минтерма
		Row(constRow&r);// конструктор копирования

		Row *Unite(Row&r);// функция объединения строк
		void print();//вывод
		bool find_in_index_arr(int n);// поиск вхождения индекса в index_arr[]
	};
	
	classTable
	{
	public:
		Row **row;// указатель на массив указателей на Row
		intsize,real_size;// количество заполненных строк и реальный размер таблицы(аллоцированный в памяти)

		Table(intsize)// конструктор таблицы заданного размера
		Table(constfal&sdnf);// создание таблицы по fal
		~Table();// деструктор
		void print();//вывод
		Table &operator = (const Table &t);//перегрузка оператора присвоения
		boolshorten();// функция сокращающая СДНФ и приводящая его к виду КДНФ, возвращает 1 если были произведены изменения иначе 0
		voidremove_eq_rows();// удаляет одинаковые строки в таблице
		bool find(int n, int r);
		bool find_in_core(int n, int r);
		Row *find_and_add_in_core(int n, int r);
		void minimize();// окончательно минимизирует функцию и приводит КДНФ к виду МДНФ
	};

Рассмотрим основные функции относящиеся непосредственно к алгоритму минимизации:
Во-первых это shorten() приводящий функцию к КДНФ
bool shorten()
{
	bool changes=false;
	Table *new_table;
	int new_size=0;
	new_table=new Table(3*size); //создание новой таблицы
	for (int i=0; i < size; i++) {
		for (int j = 0; j < size; j++) {
			if((row[i]->index!=row[j]->index &&
row[i]->n==(row[j]->n+1) &&
				row[i]->m.can_be_united(row[j]->m) &&
				row[i]->m.positions_coincide(row[j]->m)))
//если индексы строк не равны и число единиц в минтермах отличается на 1 и позиции “крестиков” совпадают 
				{
					new_table->row[new_size]=
row[i]->Unite(*row[j]);
//объединить i-тую строку cj-той
					new_table->row[new_size]->index=new_size;
					new_size=new_size+1;
//инкрементирование new_size
					changes=true;
				}
		}
	}
	for (int i=0; i < size; i++)
	{
		if(!(row[i]->united))
		{
			new_table->row[new_size]=row[i];
			new_table->row[new_size]->index=new_size;
			++new_size;
		}
	}//добавление в таблице строк не участвовавших в склеивании
	*this=*new_table;
	size=new_size;
	returnchanges;
	}

Во-вторых это minimize() приводящий функцию к МДНФ
void minimize()
{
	Table *new_table;
	Row *new_row=0;
	int new_size=0;
	new_table=new Table(size);
	for (int i=0; i < size; i++)
		for (int n=0; n < 8; n++)
			if(!this->find(row[i]->index_arr[n],i)){
				row[i]->united=1;
				new_table->row[new_size]=new Row(*row[i]);
				++new_size;
				break;
				}	
	for (int i=0; i < size; i++)
		for (int n=0; n < 8; n++)
			if(row[i]->united!=1 && row[i]->index_arr[n]!=0)
				if(!this->find_in_core(row[i]->index_arr[n],i))
				{
					new_row=this->find_and_add_in_core(row[i]->index_arr[n],i);
					if(new_row)
					{
						new_table->row[new_size]=new_row;
						++new_size;
					}
				}
	*this=*new_table;
	size=new_size
}