Алгоритм поиска в ширину - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нашел алгоритм "поиска в ширину" только на С#. Может кто-нибудь переписать его на С?
Листинг программы
  1. Random rand = new Random();
  2. Queue<int> q = new Queue<int>(); //Это очередь, хранящая номера вершин
  3. string exit = "";
  4. int u;
  5. int v;
  6. u = rand.Next(3, 5);
  7. bool[] used = new bool[u + 1]; //массив отмечающий посещённые вершины
  8. int[][] g = new int[u + 1][]; //массив содержащий записи смежных вершин
  9. for (int i = 0; i < u + 1; i++)
  10. {
  11. g[i] = new int[u + 1];
  12. Console.Write("\n({0}) вершина -->[", i + 1);
  13. for (int j = 0; j < u + 1; j++)
  14. {
  15. g[i][j] = rand.Next(0, 2);
  16. }
  17. g[i][i] = 0;
  18. foreach (var item in g[i])
  19. {
  20. Console.Write(" {0}", item);
  21. }
  22. Console.Write("]\n");

Решение задачи: «Алгоритм поиска в ширину»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <limits.h>
  4. typedef unsigned short word_t;
  5. typedef unsigned char  byte_t;
  6.  
  7. typedef struct node {
  8.     struct node* next;
  9.     word_t v;
  10. } node_t;
  11.  
  12. typedef struct {
  13.     node_t* h, *t;
  14. } queue_t;
  15.  
  16. void   queue_init(queue_t* q){ q->h = q->t = NULL; }
  17. int    queue_empty(queue_t* q){ return (q->h == NULL); }
  18. word_t queue_front(queue_t* q) { return q->h->v; }
  19. int    queue_push(queue_t* q, word_t v);
  20. void   queue_pop(queue_t* q);
  21. void   queue_clear(queue_t* q);
  22.  
  23. typedef struct {
  24.     word_t v, p;
  25. } vert_t;
  26. byte_t** graph_input(FILE* _in, int* n);
  27. void     graph_free(byte_t** g, int n);
  28. word_t*  graph_bfs(byte_t** g, int n, word_t s, word_t e, int* m);
  29.  
  30. int main(void){
  31.     int      i, n, m;
  32.     word_t*  p, s, e;
  33.     byte_t** g;
  34.  
  35. /*   ввод из файла
  36.     FILE* f = fopen("graph.txt", "rt");
  37.     if(f == NULL)
  38.         return 1;
  39.     g = graph_input(f, &n);
  40.     fclose(f);
  41. */
  42.     g = graph_input(stdin, &n);
  43.     if(g == NULL)
  44.         return 1;
  45.  
  46.     s = 3;//старт
  47.     e = 4;//конец
  48.     p = graph_bfs(g, n, s, e, &m);
  49.     if(p != NULL){
  50.         printf("path: ");
  51.         for(i = 0; i < m; ++i)
  52.             printf("%u ", p[i]);
  53.         putchar('\n');
  54.  
  55.         free(p);
  56.     } else
  57.         fputs("error find bfs!\n", stderr);
  58.  
  59.     graph_free(g, n);
  60.     return 0;
  61. }
  62.  
  63. //поиск в ширину
  64. word_t* graph_bfs(byte_t** g, int n, word_t s, word_t e, int* m){
  65.     int     i, y;
  66.     queue_t q;
  67.     vert_t* vs;
  68.     word_t  v, *p, *d, *j;
  69.  
  70.     p  = NULL;
  71.     vs = (vert_t*)malloc((size_t)n * sizeof(vert_t));
  72.     if(vs == NULL)
  73.         return NULL;
  74.     for(i = 0; i < n; ++i)
  75.         vs[i].p = vs[i].v = USHRT_MAX;
  76.    
  77.     vs[s].v = 0;
  78.     queue_init(&q);
  79.     queue_push(&q, s);
  80.  
  81.     y = 0;
  82.     while(! queue_empty(&q)){
  83.         v = queue_front(&q);
  84.         queue_pop(&q);
  85.         if(v == e){
  86.             y = 1;
  87.             break;
  88.         }
  89.         for(i = 0; i < n; ++i){
  90.             if((g[v][i] != 0) && (vs[i].v > (vs[v].v + 1))){
  91.                 queue_push(&q, (word_t)i);
  92.                 vs[i].p = v;
  93.                 vs[i].v = vs[v].v + 1;
  94.             }
  95.         }
  96.     }
  97.     queue_clear(&q);
  98.  
  99.     if(y){
  100.         v = e;
  101.         i = 1;
  102.         while(v != s){
  103.             v = vs[v].p;
  104.             ++i;
  105.         }
  106.         p = (word_t*)malloc((size_t)i * sizeof(word_t));
  107.         if(p == NULL)
  108.             return NULL;
  109.  
  110.         d = p;
  111.         for(*d++ = e; e != s; e = vs[e].p)
  112.             *d++ = vs[e].p;
  113.        
  114.         for(--d, j = p; j < d; ++j, --d){
  115.             v  = *d;
  116.             *d = *j;
  117.             *j = v;
  118.         }
  119.         *m = i;
  120.     }
  121.     free(vs);
  122.     return p;
  123. }
  124.  
  125. /*
  126. ввод неориентированного графа, формат
  127.     N - кол-во вершин  M - кол-во рёбер
  128. */
  129. byte_t** graph_input(FILE* _in, int* n){
  130.     int      i, j, vn, em, a, b;
  131.     byte_t** g;
  132.     if((fscanf(_in, "%d %d", &vn, &em) != 2) || (vn <= 1) || (em <= 1))
  133.         return NULL;
  134.  
  135.     g = (byte_t**)malloc((size_t)vn * sizeof(byte_t*));
  136.     if(g == NULL)
  137.         return NULL;
  138.  
  139.     for(i = 0; i < vn; ++i){
  140.         g[i] = (byte_t*)calloc((size_t)vn, sizeof(byte_t));
  141.         if(g[i] == NULL){
  142.             i -= 1;
  143.             goto err;
  144.         }
  145.     }
  146.  
  147.     for(i = 0; i < em; ++i){
  148.         if(fscanf(_in, "%d %d", &a, &b) == 2){
  149.             if((a < vn) && (b < vn))
  150.                 g[a][b] = g[b][a] = 1;
  151.         } else
  152.             break;
  153.     }
  154.     *n = vn;
  155.     return g;
  156. err:
  157.     for(j = i; j >= 0; --j)
  158.         free(g[j]);
  159.     free(g);
  160.     return NULL;
  161. }
  162.  
  163. //удаление графа из памяти
  164. void graph_free(byte_t** g, int n){
  165.     int i;
  166.     for(i = 0; i < n; ++i)
  167.         free(g[i]);
  168.     free(g);
  169. }
  170.  
  171. //---------------
  172. //вставка
  173. int queue_push(queue_t* q, word_t v){
  174.     node_t* p = (node_t*)malloc(sizeof(node_t));
  175.     if(p != NULL){
  176.         p->v    = v;
  177.         p->next = NULL;
  178.         if(q->h == NULL)
  179.             q->h = q->t = p;
  180.         else {
  181.             q->t->next = p;
  182.             q->t = p;
  183.         }
  184.     }
  185.     return (p != NULL);
  186. }
  187.  
  188. //извлечение
  189. void queue_pop(queue_t* q){
  190.     node_t* t;
  191.     if(q->h != NULL){
  192.         t    = q->h;
  193.         q->h = q->h->next;
  194.         free(t);
  195.         if(q->h == NULL)
  196.             q->t = NULL;
  197.     }
  198. }
  199.  
  200. //удаление всех
  201. void queue_clear(queue_t* q){
  202.     while(! queue_empty(q))
  203.         queue_pop(q);
  204. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы