过往的不只云烟 2018-04-24 09:12 采纳率: 100%
浏览 1090
已采纳

数据结构森林的遍历和搜索问题

数据结构森林如何用c语言实现遍历?(最好用递归实现)
如何实现搜索(参数是数据和顶点指针,返回结果是结点指针)

  • 写回答

1条回答 默认 最新

  • threenewbee 2018-04-24 14:28
    关注

    用深度优先搜索(deep first search,DFS)写一个:

     #include <iostream>
    #include <string>
    
    using namespace std;
    
    #define MAXLEN 10
    
    struct Node
    {
     int data;
     Node *next;
    };
    
    struct Link
    {
     int count;
     string name;
     Node *head;
    };
    
    struct Graph
    {
     Link link[MAXLEN];
     int vexnum;
     int arcnum;
    };
    
    int findIndex(Graph &G, string name)
    {
     int index = -1;
    
     for (int i = 0; i < G.vexnum; i++)
     {
     if (G.link[i].name == name)
     {
      index = i;
      break;
     }
     }
    
     if (index == -1)
     cout << "error" << endl;
    
     return index;
    }
    
    void constructGraph(Graph &G)
    {
     cout << "construct graph yooo" << endl;
     cout << "enter vexnum" << endl;
     cin >> G.vexnum;
    
     string array[] = {"v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8"};
     const int size = sizeof array / sizeof *array;
    
     for (int i = 0; i < G.vexnum; i++)
     {
     G.link[i].name = array[i];
     G.link[i].head = NULL;
     }
    
     string leftName;
     string rightName;
    
     cout << "enter a pair" << endl;
     cin >> leftName >> rightName;
     while (leftName != "end" && rightName != "end")
     {
     int leftIndex = findIndex(G, leftName);
     int rightIndex = findIndex(G, rightName);
    
     Node *node = new Node;
     node->data = rightIndex;
     node->next = NULL;
    
     node->next = G.link[leftIndex].head;
     G.link[leftIndex].head = node;
    
     cout << "enter a pair" << endl;
     cin >> leftName >> rightName;
     }
    }
    
    bool flag[MAXLEN];
    
    void DFSTranverse(Graph &G, int num)
    {
     cout << G.link[num].name << " ";
     flag[num] = true;
    
     Node *head = G.link[num].head;
     while (head != NULL)
     {
     int index = head->data; //如果你需要把遍历修改为搜索,可以在这里判断
     if (!flag[index]) //判断下是否已经遍历过
      DFSTranverse(G, index); //注意,这里是递归
     head = head->next;
     }
    }
    
    void main()
    {
     Graph G;
     constructGraph(G); //生成一个图
     for (int i = 0; i < MAXLEN; i++)
     flag[i] = false; //初始化,默认所有节点都没有遍历过
     DFSTranverse(G, 0); //搜索,第二个参数是从哪个节点寻找
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何解决y_true和y_predict数据类型不匹配的问题(相关搜索:机器学习)
  • ¥15 PB中矩阵文本型数据的总计问题。
  • ¥40 宿舍管理系统设计(c#)
  • ¥15 MATLAB卫星二体模型仿真
  • ¥15 怎么让数码管亮的同时让led执行流水灯代码
  • ¥20 SAP HANA SQL Script 。如何判断字段值包含某个字符串
  • ¥85 cmd批处理参数如果含有双引号,该如何传入?
  • ¥15 fx2n系列plc的自控成型机模拟
  • ¥15 时间序列LSTM模型归回预测代码问题
  • ¥50 使用CUDA如何高效的做并行化处理,是否可以多个分段同时进行匹配计算处理?目前数据传输速度有些慢,如何提高速度,使用gdrcopy是否可行?请给出具体意见。