为图2建立邻接表存储结构,并对实验所建立的邻接表进行深度优先遍历。/验证实验/



#include<stdio.h>
#include<iostream.h>
#define MAX 100
#define N 100




typedef struct 
{
char v[N];
}A;


typedef struct node                     //邻接表表结点
{  
    int adjvex;                         //邻接点域
    struct node  * next;                //指向下一个邻接点的指针域
    int juli;                           //表示边上信息
}EdgeNode;    


   
typedef struct vnode                  //表头结点
{   
A a;                              //存结点信息
    EdgeNode  * firstedge;            //边表头指针
}VertexNode;


typedef struct
{
    VertexNode adjlist[MAX];     
int visited[MAX];
    int n,e;                                               /*顶点数和边数*/
}ALGraph;           










void createALGraph(ALGraph *G)                       //创建邻接表
{
    printf("请分别输入要访问的城市个数和总共的道路数:\n");//顶点、边
    cin>>G->n>>G->e;   
    printf("定义一个起始城市,输入它,从它开始,按自己规定的顺序依次输入其余城市名称:\n");
    for (int i = 0; i < G->n ; i++)                  //建立有n个顶点的顶点表
    {       
        scanf("%s",G->adjlist[i].a.v);               //读入顶点信息
        G->adjlist[i].firstedge = NULL;              //顶点的边表头指针设为空
    }
/* EdgeNode *s;
 int m,n;
 printf("请从你定义的起始城市开始,输入每一条道路它所连接的前后的两个城市以及它们的距离:\n");
    for (int k=0; k<G->e; k++)                     
    {
        cin>>G->adjlist->firstedge.juli;
        s = new EdgeNode;                        //生成新边表结点s
        s->adjvex = n;                          //邻接点序号为n
        s->next = G->adjlist[m].firstedge;      //将新边表结点s用头插法插入到顶点Vi 的边表头部
        G->adjlist[m].firstedge = s;
    }*/
}
 


void DFSAL(ALGraph *G, int i)                                 //深度优先遍历

    cout<<"第"<<i+1<<"个城市"<<":"<<G->adjlist[i].a.v<<endl;  //访问顶点信息
    G->visited[i]=1;                                          //标记vi已访问
EdgeNode *p;
    p=G->adjlist[i].firstedge;                                //取vi边表的头指针
    while(p)                                                  //如果p不空,依次搜索vi的邻接点vj
    {
        if (G->visited[p->adjvex]==0)                         //若vj尚未访问,则以vj为出发点向纵深搜索
        DFSAL(G,p->adjvex);
        p=p->next;                                            //找vi的下一个邻接点
    }
}


void DFS(ALGraph *G)   
{
    int i;
    for (i=0; i<G->n; i++)
        G->visited[i]=0;    /*标志向量初始化*/
    for (i=0; i<G->n; i++)  //vi未访问过,从vi开始DFS搜索
        if (G->visited[i]==0)
         DFSAL(G,i);                
}




/*************************************************************/




int main()
{  
      printf("2:以邻接表为储存方式的深度优先搜索\n");
            ALGraph G;
   printf("现在开始构建邻接表!\n");
            createALGraph(&G);
   printf("现在开始Depth-First-Search!\n");
            DFS(&G); 


大同 北京 济南 郑州 西安 太原 石家庄
大同—北京,其间距离379 大同—太原,其间距离355 北京—济南,其间距离298 北京—石家庄,其间距离283 济南—郑州,其间距离615 济南—石家庄,其间距离298 郑州—西安,其间距离620 郑州—石家庄,其间距离412 西安—太原,其间距离1554 西安—石家庄,其间距离1552 太原—石家庄,其间距离340 
1 2 379 1 6 355 2 3 298 2 7 283 3 4 615 3 6 298 4 5 620 4 7 412 5 6 1554 5 7 1552 6 7 340
//队列
2 379 0
6 355 1
3 298 0
7 283 1
4 615 0
6 298 1
5 620 0
7 412 1
6 1554 0
7 1552 1
7 340 1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我很乐意回答你的问题。首先,让我们来了解一下有向的邻接矩阵和邻接表存储结构。 有向的邻接矩阵存储结构是用一个二维数组来表示中各个顶点之间的关系。其中,数组的行和列坐标对应于中的各个顶点,数组元素的值表示两个顶点之间是否存在一条有向边,也可以表示边的权值。如果顶点 i 和顶点 j 之间存在一条边,则数组元素 a[i][j] 的值为 1 或非零值;如果不存在一条边,则 a[i][j] 的值为 0。 有向邻接表存储结构是利用链表来存储中各个顶点之间的关系。具体来说,每个顶点对应一个链表,链表中存储该顶点所指向的顶点列表。这个过程可以用一个数组和多个链表来实现,其中数组中的每个元素都对应一个链表。 接下来,让我们来实现两种遍历运算和简单路径求解: 1. 深度优先遍历(DFS):从起点发,尽可能深地探索每一个分支,直到该路径不能继续为止。然后回溯到前一个节点,继续探索其他分支。 2. 广度优先遍历(BFS):从起点发,按照距离由近及远的顺序依次访问每个顶点,直到遍历完所有的顶点为止。 3. 简单路径求解:在有向中,简单路径是指不包含重复边和重复顶点的路径。简单路径求解算法可以使用深度优先遍历或广度优先遍历来实现。 以上就是有关有向的邻接矩阵和邻接表存储结构以及遍历运算和简单路径求解的一些基本知识和算法。希望这能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿你温暖喜悦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值