图的建立之邻接表的建立及遍历
来源:互联网 发布:字幕重叠拼图软件 编辑:程序博客网 时间:2024/05/16 15:58
图的建立的基本是邻接矩阵,如果是无向,或者五向的话就用(0,1)表示即可,而有权重的则需要考虑将也用其权重表示;
邻接表的建立
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXVEX 100
bool visited[MAXVEX];
typedef struct EdgeNode1//边表结点,就是每个节点后面连接的东西
{
int adjvex;//存储的是邻接点的index
int weight;
struct EdgeNode1 *next;
}edgenode,*EdgeNode;
typedef struct VertxtNode//顶点表节点
{
char data;
EdgeNode next;
}vertxt,Adjlist[MAXVEX];
typedef struct {
int numVertext,numedges;//节点数,边数
Adjlist adjlist;
}GraphAdjlist;
void CreatALGrath(GraphAdjlist *G);
void DFS(GraphAdjlist G,int i);
void DFSvisited(GraphAdjlist G);
void Print(GraphAdjlist *G);
int main(){
GraphAdjlist *G;
G =(GraphAdjlist*)malloc(sizeof(GraphAdjlist));
CreatALGrath(G);
//Print( G);
DFSvisited(*G);
return 0;
}
void CreatALGrath(GraphAdjlist *G)//利用邻接表的方式建立一个无向图
{
int i,j,k;
EdgeNode e;
printf("请输入节点个数与边数:");
scanf("%d%d",&i,&j);
G->numedges = j;
G->numVertext = i;
getchar();
for(i=0;i<G->numVertext;i++){
printf("请输入第%d个节点",i+1);
scanf("%c",&G->adjlist[i].data);
G->adjlist[i].next = NULL;
getchar();
}
for(int k=0;k<G->numedges;k++){
printf("请输入vi,vj边上的序号:");
scanf("%d%d",&i,&j);
//将表边连接给vi,头插法减少时间复杂度,为O(n+e)
e = (EdgeNode)malloc(sizeof(edgenode));
e->adjvex = j;
e->next = G->adjlist[i].next;
G->adjlist[i].next = e;
//将表边连接给vj
e = (EdgeNode)malloc(sizeof(edgenode));
e->adjvex = i;
e->next = G->adjlist[j].next;
G->adjlist[j].next = e;
}
}
/*
通过递归进行邻接表的深度优先遍历
通过设置记号,判别是否以遍历过该节点,时间复杂度O(n+e)
定义:从图中某一个点出发,访问此顶点,然后访问该点的子节点中所存的邻界点的index,再通过index
通过index访问表头结点,直到图中所有的和v有路径想通的节点都被访问到 为止
*/
void DFS(GraphAdjlist G,int i){
visited[i] = true;
//printf("%d",visited[i]);
EdgeNode p;
printf("%c ",G.adjlist[i].data);
p = G.adjlist[i].next;
while(p!=NULL){
//printf("xvcn");
if(visited[p->adjvex]==false)
{
DFS(G,p->adjvex);//访问相邻的表头节点
}
p = p->next;
}
//
}
void DFSvisited(GraphAdjlist G)
{
for(int i=0;i<G.numVertext;i++){
visited[i] = false;
//printf("%d",visited[i]);
}
for(int i = 0;i<G.numVertext;i++){
if(visited[i]==0){
DFS(G,i);
}
}
}
void Print(GraphAdjlist *G){
printf("%d %c",G->adjlist[0].next->adjvex,G->adjlist[0]);
}
0 0
- 图的建立之邻接表的建立及遍历
- 关于图的邻接表存储建立方式及深度遍历的个人理解以及数据结构7.22的算法
- 数据结构邻接表的建立以及两种遍历
- 邻接表的建立和广度优先遍历
- 数据结构图的建立和遍历(邻接表、邻接矩阵)
- 图的邻接表的建立 c++
- 邻接表存储图的建立
- 图的邻接表建立思想
- 邻接链表的建立
- vector 邻接表的建立
- 静态邻接表的建立
- 基于邻接表的图的基本操作(建立,遍历)
- 建立图的邻接表储存并实现深度优先和广度优先遍历
- 图的建立及BFS,DFS遍历
- 三、图的建立及遍历
- 图---邻接表(建立,深度遍历,广度遍历)
- 图---邻接表(建立,深度遍历,广度遍历)
- 图---邻接表(建立,深度遍历,广度遍历)
- python学习
- tensorflow `conv2d max_pool 方法参数
- DataGridView实现列头ChechBox人性化方案。
- c#110课的主要内容
- 在Android开发中,定时执行任务的3种实现方法
- 图的建立之邻接表的建立及遍历
- C++ 初始化列表和构造函数
- postgresql安装、TPC-H测试和代码调试
- 数据结构实验之链表七:单链表中重复元素的删除
- 你所不知道的Activity转场动画——ActivityOptions
- XUtils3实现进度条文件上传
- 统计输入的单词中不同单词的数量的C++代码
- JavaScript中的继承以及实现继承的几种方法
- linux route命令的使用详解