有向图的邻接表的建立,深度遍历并输出(c语言实现有向网)

有向图的邻接表的建立,深度遍历并输出(c语言实现有向网)

  • [ ]为方便理解。 首先先为图的邻接表画一个模型,
  • 邻接表可以分为两部分(1.表头节点,2.弧节点)
  • 如上图,因为写的代码是有向网,所以选择上图,首先在脑海里建立一个模型
  • 代码如下
#include<stdio.h>
#include<stdlib.h>
int visited[20]; //顶点的访问标志 
 
//*邻接表用两部分表示  1顶点节点包含(data firstarc) 2弧节点包含(adjvex, *next weigh) 
typedef enum {DG/*有向图*/,DN/*有向网*/,UDG/*无向图*/,UDN/*无向网*/} GraphKind;

typedef struct ArcNode{
	int adjvex;//该弧指向顶点的位置 
  struct ArcNode *next;//指向下一条弧的指针 
	int  weigh;//弧的权值 
}ArcNode;


typedef struct vertexNode{ 
	int data;//顶点数据 
	 ArcNode * firstarc;//指向该顶点第一条弧的指针 
}vertexNode; 

typedef struct{
	vertexNode vertex[20];
	int vexnum;
	int arcnum;//图的顶点数量和弧的数量 
	//GraphKind kind;//图的种类 
} AdjList; 

int creat(AdjList *a)
{
	int i,j,n;
	int sum;//sum和arcnum一样代表图中总的弧数 
	ArcNode *p1,*p2,c;
	printf("请输入图顶点的总个数和弧的总个数\n");
	scanf("%d %d",&a->vexnum,&a->arcnum);
	sum=a->arcnum; 
	for(i=0;i<a->vexnum;i++)
    	a->vertex[i].firstarc=NULL;//初始化和顶点第一个相邻的弧为空; 
	for(i=0;i<a->vexnum;i++)
	{
	 	
	printf("***请输入第%d个顶点的值***\n",i);
	scanf("%d",&a->vertex[i].data);
	 if(sum==0) continue;
	printf("请输入和本顶点相关弧的个数\n");
	scanf("%d",&n); 
	 
	for(j=0;j<n;j++)
	{
		if(j==0)
		{

		  int q;
			p1=p2=( ArcNode*)malloc(sizeof(ArcNode));
			//p1=p2=&c;
			p1->next=p2->next=NULL;
			a->vertex[i].firstarc=p1;
			printf("请输入与第%d个顶点相邻的,第%d个相邻的弧顶点(位置) 以及弧的权值\n",i,j);
			scanf("%d %d",&p1->adjvex,&p1->weigh);
			//printf("%d %d",p1->adjvex,p2->weigh);	
			sum--;		 			 
		}
		else{
			p2=(ArcNode*)malloc(sizeof(ArcNode));
			p2->next=NULL;
			p1->next=p2;
			printf("请输入第%d个顶点 第%d个相邻的弧顶点 以及两个顶点间弧的权值\n",i,j);
			scanf("%d %d",&p2->adjvex,&p2->weigh);	
			sum--;		
		}
		
	}
	printf("**************************\n");
	
		
	}
}

void print( AdjList a)//输出矩阵 
{
    int i,j;
    for(i=0;i<a.vexnum;i++)
    {
    	ArcNode *p;
    	p=a.vertex[i].firstarc;
    	printf(" [%d]",a.vertex[i].data);
    	
        while(p)
        {
        	printf("----->");
        	printf("[%d %d]",p->adjvex,p->weigh);
        	p=p->next; 
        
		}
        
    	printf("\n");
	}
	
}
void traverseGraph( AdjList a){//深度优先遍历图 
     int i,j;
     for(i=0;i<a.vexnum;i++)
     visited[i]=0;//标志全部顶点为访问
	 for(i=0;i<a.vexnum;i++)
	 {
	 	if(!visited[i]) 
	 	DepthFirstSearch(a,i); 
	 } 
	
}

int  DepthFirstSearch(AdjList a,int i){
	ArcNode *p;
	printf(" %d",a.vertex[i].data);
	visited[i]=1;
	p=a.vertex[i].firstarc;
	while(p)
	{
		if(!visited[p->adjvex])
		DepthFirstSearch(a,p->adjvex); 
		p=p->next; 
	}
	
}
int main()
{   AdjList a;

      creat(&a);
      print(a);//邻接表形式输出图
      printf("***深度遍历图***\n");
	  traverseGraph(a); //深度优先遍历图

 } 

测试了下
在这里插入图片描述

  • 8
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是有向图邻接表的广度优先搜索和深度优先遍历的完整代码,使用 C 语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAXN 1000 struct Graph { int n; int adj_list[MAXN][MAXN]; }; struct Graph* create_graph(int n) { struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph)); graph->n = n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { graph->adj_list[i][j] = 0; } } return graph; } void add_edge(struct Graph* graph, int u, int v) { graph->adj_list[u][v] = 1; } void bfs(struct Graph* graph, int start) { bool visited[MAXN] = {false}; int queue[MAXN]; int front = 0, rear = 0; queue[rear++] = start; visited[start] = true; while (front < rear) { int v = queue[front++]; printf("%d ", v); for (int u = 0; u < graph->n; u++) { if (graph->adj_list[v][u] && !visited[u]) { queue[rear++] = u; visited[u] = true; } } } } void dfs(struct Graph* graph, int v, bool visited[]) { visited[v] = true; printf("%d ", v); for (int u = 0; u < graph->n; u++) { if (graph->adj_list[v][u] && !visited[u]) { dfs(graph, u, visited); } } } void dfs_traversal(struct Graph* graph) { bool visited[MAXN] = {false}; for (int v = 0; v < graph->n; v++) { if (!visited[v]) { dfs(graph, v, visited); } } } int main() { int n, m; scanf("%d%d", &n, &m); struct Graph* graph = create_graph(n); for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); add_edge(graph, u, v); } int start; scanf("%d", &start); bfs(graph, start); printf("\n"); dfs_traversal(graph); printf("\n"); return 0; } ``` 其中,Graph 结构体表示一个有向图,n 表示顶点的数量,adj_list 是邻接表,使用二维数组实现。create_graph 函数用于创建一个有 n 个顶点的图,并初始化邻接表。add_edge 函数用于添加一条从顶点 u 到顶点 v 的有向边。bfs 函数实现了广度优先搜索,dfs 函数实现深度优先遍历,dfs_traversal 函数用于遍历整个图。在 dfs 函数中,visited 数组用于记录每个顶点是否被访问过,v 表示当前访问的顶点。在 dfs_traversal 函数中,首先初始化 visited 数组,然后从每个未被访问过的顶点开始执行 dfs。在主函数中,首先读入图的信息,然后调用 bfs 和 dfs_traversal 函数进行遍历

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值