vs_node_inp->input_pointer = current_node->input_pointer;

  vs_node_out->output_pointer = current_node->output_pointer;

  vs_node_inp->uid = uid_index;

  uid_index += 1;

  vs_node_out->uid = uid_index;

  uid_index += 1;

  vs_node_inp->input_pointer->node_pointer = vs_node_inp;

  vs_node_out->output_pointer->node_pointer = vs_node_out;

  new_arc = (arc *) malloc(sizeof (arc));

  new_arc->prev = NULL;

  new_arc->next = NULL;

  inp_for_arc = (aux_elem_input *) malloc(sizeof (aux_elem_input));

  inp_for_arc->input_pointer = NULL;

  inp_for_arc->next = NULL;

  out_for_arc = (aux_elem_output *) malloc(sizeof (aux_elem_output));

  out_for_arc->output_pointer = NULL;

  out_for_arc->next = NULL;

  strcpy(new_arc->name, "");

  strcat(new_arc->name, vs_node_out->name);

  strcat(new_arc->name, "->");

  strcat(new_arc->name, vs_node_inp->name);

  if (current_arc)

  while (current_arc->next!= NULL)

  current_arc = current_arc->next;

  if (current_arc)

  current_arc->next = new_arc;

  new_arc->prev = current_arc;

  current_arc = head_arc;

  current_aux_elem_out = vs_node_out->output_pointer->aux_elem_pointer;

  if (current_aux_elem_out)

  while (current_aux_elem_out->next!= NULL)

  current_aux_elem_out = current_aux_elem_out->next;

НЕ нашли? Не то? Что вы ищете?

  new_aux_out = (aux_elem_arc *) malloc(sizeof (aux_elem_arc));

  new_aux_out->next = NULL;

  new_aux_out->arc_pointer = new_arc;

  if (current_aux_elem_out)

  current_aux_elem_out->next = new_aux_out;

  current_aux_elem_inp = vs_node_inp->input_pointer->aux_elem_pointer;

  if (current_aux_elem_inp)

  while (current_aux_elem_inp->next!= NULL)

  current_aux_elem_inp = current_aux_elem_inp->next;

  new_aux_inp = (aux_elem_arc *) malloc(sizeof (aux_elem_arc));

  new_aux_inp->next = NULL;

  new_aux_inp->arc_pointer = new_arc;

  if (current_aux_elem_inp)

  current_aux_elem_inp->next = new_aux_inp;

  new_arc->aux_elem_input_pointer = inp_for_arc;

  new_arc->aux_elem_output_pointer = out_for_arc;

  new_arc->aux_elem_input_pointer->input_pointer = vs_node_inp->input_pointer;

  new_arc->aux_elem_output_pointer->output_pointer = vs_node_out->output_pointer;

  new_arc = (arc *) malloc(sizeof (arc));

  new_arc->prev = NULL;

  new_arc->next = NULL;

  inp_for_arc = (aux_elem_input *) malloc(sizeof (aux_elem_input));

  inp_for_arc->input_pointer = NULL;

  inp_for_arc->next = NULL;

  out_for_arc = (aux_elem_output *) malloc(sizeof (aux_elem_output));

  out_for_arc->output_pointer = NULL;

  out_for_arc->next = NULL;

  strcpy(new_arc->name, "");

  strcat(new_arc->name, vs_node_inp->name);

  strcat(new_arc->name, "->");

  strcat(new_arc->name, vs_node_out->name);

  if (current_arc)

  while (current_arc->next!= NULL)

  current_arc = current_arc->next;

  if (current_arc)

  current_arc->next = new_arc;

  new_arc->prev = current_arc;

  current_arc = head_arc;

  new_aux_inp = (aux_elem_arc *) malloc(sizeof (aux_elem_arc));

  new_aux_inp->next = NULL;

  new_aux_inp->arc_pointer = new_arc;

  vs_node_out->input_pointer->aux_elem_pointer = new_aux_inp;

  new_aux_out = (aux_elem_arc *) malloc(sizeof (aux_elem_arc));

  new_aux_out->next = NULL;

  new_aux_out->arc_pointer = new_arc;

  vs_node_inp->output_pointer->aux_elem_pointer = new_aux_out;

  new_arc->aux_elem_input_pointer = inp_for_arc;

  new_arc->aux_elem_output_pointer = out_for_arc;

  new_arc->aux_elem_input_pointer->input_pointer = vs_node_out->input_pointer;

  new_arc->aux_elem_output_pointer->output_pointer = vs_node_inp->output_pointer;

  if (first_time == 1) {

  new_node_list = vs_node_inp;

  work_new_node_list = vs_node_out;

  first_time += 1;

  } else {

  work_new_node_list->next = vs_node_inp;

  vs_node_inp->prev = work_new_node_list;

  while (work_new_node_list->next!= NULL)

  work_new_node_list = work_new_node_list->next;

  }

  current_node = current_node->next;

  }

  long result = -1;

  long global_result = 1000;

  long ways_number = 0;

  long way_free = 1;

  long prv;

  long enffl_finded = 0;

  // Эта штука тоже вызывает опасения.

  // memset(a, 0, sizeof(a));

  long used[1000];

  memset(used, 0, sizeof(used));

  long checked[100][100];

  memset(checked, 0, sizeof(checked));

  long prev[100];

  memset(prev, 0, sizeof(prev));

  node *source, *effluent;

  output *current_output;

  aux_elem_arc *aux_pointer = NULL;

  source = new_node_list->next;

  if (source->next)

  if (source->next->next)

  effluent = source->next->next->next;

  queue *que;

  que = (queue *) malloc(sizeof (queue));

  init_que(que);

  while (source) {

  while (effluent) {

  while (way_free == 1) {

  init_que(que);

  push_front(que, source);

  used[source->uid] = 1;

  enffl_finded = 0;

  while (enffl_finded == 0 && que->tail!= NULL) {

  current_node = pop_back(que);

  if (current_node)

  if (current_node->output_pointer)

  if (current_node->output_pointer->aux_elem_pointer)

  if (current_node->output_pointer->aux_elem_pointer)

  aux_pointer = current_node->output_pointer->aux_elem_pointer;

  while (aux_pointer!= NULL) {

  if (aux_pointer->arc_pointer->aux_elem_input_pointer)

  if (used[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] == 0)

  if (checked[current_node->uid][aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] == 0) {

  used[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] = 1;

  prev[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] = current_node->uid;

  if (aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer == effluent)

  enffl_finded = 1;

  push_front(que, aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer);

  }

  aux_pointer = aux_pointer->next;

  }

  }

  if (enffl_finded == 1) {

  prv = effluent->uid;

  if (source->uid)

  while (prv!= source->uid) {

  checked[prv][prev[prv]] = 1;

  checked[prev[prv]][prv] = 1;

  prv = prev[prv];

  }

  current_output = source->output_pointer;

  way_free = 0;

  while (current_output!= NULL) {

  if (current_output->aux_elem_pointer) {

  aux_pointer = current_output->aux_elem_pointer;

  while (aux_pointer) {

  if (aux_pointer->arc_pointer->aux_elem_input_pointer)

  if (checked[source->uid]

  [aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] == 0)

  way_free = 1;

  aux_pointer = aux_pointer->next;

  }

  }

  current_output = current_output->next;

  }

  ways_number += 1;

  if (ways_number >= result)

  result = ways_number;

  } else

  way_free = 0;

  init_que(que);

  memset(used, 0, sizeof (used));

  memset(prev, 0, sizeof (prev));

  }

  if (result <= global_result)

  global_result = result;

  memset(checked, 0, sizeof (checked));

  ways_number = 0;

  result = -1;

  way_free = 1;

  enffl_finded = 0;

  if (effluent->next)

  effluent = effluent->next->next;

  }

  if (source->next)

  source = source->next->next;

  else

  source = NULL;

  if (source)

  if (source->next)

  if (source->next->next)

  effluent = source->next->next->next;

  }

  if (g->number_of_nodes == 2)

  global_result = 1;

  free(graph_copy);

  return global_result;

}

#endif        /* CHECK_GRAPH_H */

/*

* Функции вычисляющие характеристики графа. Связность, количество компонент связности,

* вершинную и ребёрную связность. Для вычисления вершинной связности необходимо

* создавать копию исходного графа, так как его структура подвергнется изменениям.

*/

#ifndef CHECK_GRAPH_H

#define        CHECK_GRAPH_H

#define ABSOLUTE_MAX 100000

#define MAX_ELEM 1000

#define MAX_RIB 1000

#define RIB_SIZE 100

#include "structs_description. h"

//#include "load_module. h"

#include "functions. h"

#include "graph_copy. h"

#include "walk_through. h"

typedef struct _queue queue;

struct _queue {

  node *head;

  node *tail;

};

int find_num_conponents(graph *g);

int find_rib_relations(graph *g);

int find_node_relations(graph *g);

int check_relations(graph *g);

void init_que(queue* que) {

  que->head = NULL;

  que->tail = NULL;

}

void destroy_que(queue* que) {

  node* cursor;

  while (que->tail) {

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9