Поиск минимального подмножества вершин заданного орграфа, от которых достижимы все остальные его вершины, страница 3

return resh - возвращает счётчик типа char, который равен 1, если все элементы массива-доступных-путей-для-подмножества равны 1 и равен 0, в противном случае. resh   { 0 ; 1 }

void Perebor(int * & buf,int q,int number,int i) – функция изменяющая массив buf – массив-вариант-вершин на следующий вариант. Возвращает массив buf неявно. int *buf – указатель на массив-вариант-вершин. Его элементы – номера вершин графа типа int; int q – позиция в массиве buf, которую нужно изменить; int number - количество вершин в графе. Number  [0;+     ); int i – количество элементов в массиве buf.

void Output(int *buf,FILE *out,list *head,int i) – функция вывода в файл имён вершин, которые записаны в массиве buf. int *buf – указатель на массив-вариант-вершин. Его элементы – номера вершин графа типа int; FILE *out - указатель на поток – исходящий файл”; list *head – указатель на список с элементами – наименование вершины графа; int i – количество элементов в массиве buf.

char Zadacha(char **matrix2,int i,int number,list *head,FILE *out) – функция анализа матрицы-путей. Берёт вариант взятия вершин из Графа из функции Perebor и проверяет этот вариант в функции Program. Если Program возвращает resh=1, то выводит этот вариант с помощью функции Output.

return resh - возвращает счётчик типа char, который равен 0, если решение не найдено и равен 1, если решение найдено. resh   { 0 ; 1 }

6. Текст программы

#include<stdio.h>

#include<stdlib.h>

struct name { name *next;                                                                            //определение структур

char sim; };

struct list { list *next;

name *sim; };

struct stack { char sim;

stack *next; };

typedef stack stack;

int InputVer (list *head, FILE *in)            // функция ввода названий вершин графа в список

{ int number=0,i,k,t; list *p; name *m; char g;

p=head;

while (g!='\n' && !feof(in) )                       // ввод названия вершин пока не конец файла и

{ p->next=new list;                               //не конец строки

p=p->next;

m=p->sim;

fscanf (in,"%c",&g);                                   //ввод названия вершины посимвольно в

while (g!=',' && g!='\n' && !feof(in) )      // динамический список

{ m->next=new name;

m=m->next;

m->sim=g;

fscanf (in,"%c",&g);

}

m->next=NULL;

m=p->sim;

number++;                                      //увеличиваем счётчик количества вершин графа

}

p->next=NULL;

return number;                                      //возвращаем количество переменных графа

}

int Search (list *head, name *beg)                         // функция поиска слова, находящегося

{ char v=1,place=0; list *p; name *k,*q;                  // посимвольно в списке в списке с

p=head->next;                                                        // элементами  – словами, находящимися

q=p->sim->next;                                                    // посимвольно в списке.

k=beg->next;

while (!id)                                                               // Пока не найдено идентичное слово

{ if (q->sim!=k->sim)       //если буквы не равны, то счётчик порядкового номера

{ place++;               // вершины увеличиваем на единицу и переходим к

p=p->next;           // следующему слову в списке. Указатель, передвигающийся

q=p->sim->next;  // по списку со словом, которое ищем, делаем указывающим на

k=beg->next;       // начало списка

}

else                             //иначе, если конец обоих слов, то найдено идентичное слово.

{ if (q->next==NULL && k->next==NULL) id=1;

q=q->next;        // Передвигаем указатели в словах на следующую букву

k=k->next;

}

}

return place;                      // возвращаем порядковый номер вершины

}

void InputDug (list *head, FILE *in, char **matrix1)        // функция ввода дуг в матрицу-дуг

{ int i; char g,l,v,place1,place2; name *m,*beg;

while (!feof(in))                                                           // считываем дугу, пока не конец файла

{ beg=new name;

m=beg;