6.1 图的存储结构

6.1.1 邻接矩阵
#include<stdio.h>
#define MAXSIZE 20//最多顶点个数
#define INFINITY 32768//表示极大值
typedef int Elemtype;
typedef int OtherInfo;
typedef enum{DG,DN,UDG,UDN
}GraphKind;//有向图 有向网 无向图 无向网 
typedef char VertexData;//顶点数据类型 
typedef struct ArcNode{
	Elemtype adj;//无权图用0,1表示是否相邻,对有权图表示权值类型 
	OtherInfo info;
}ArcNode;
typedef struct{
	VertexData vertex[MAXSIZE];//顶点向量 
	ArcNode arcs[MAXSIZE][MAXSIZE];//邻接矩阵 
	int vexnum,arcnum;//顶点数和弧数 
	GraphKind kind;//图的种类标志 
}AdjMatrix; 

int LocateVertex(AdjMatrix *G,VertexData v)//求顶点位置函数 
{
	int j=-1,k;
	for(k=0;k<G->vexnum;k++)
		if(G->vertex[k]==v)
		{
			j=k;
			break;
		}
	return(j); 
}
int CreateDN(AdjMatrix *G)//创建一个有向网 
{
	int i,j,k=0,weight;
	VertexData v1,v2;
	printf("请输入图的顶点数和弧数:"); 
	scanf("%d,%d",&G->vexnum,&G->arcnum);
	
	for(i=0;i<G->vexnum;i++)
		for(j=0;j<G->vexnum;j++)
			G->arcs[i][j].adj=INFINITY;
	printf("请输入图的顶点:"); 
	char ch=getchar();
	for(i=0;i<G->vexnum;i++)
		scanf("%c",&G->vertex[i]);
	printf("请输入一条弧的两个顶点和权值:"); 
	while(k<G->arcnum)
	{
		ch=getchar();
		scanf("%c,%c,%d",&v1,&v2,&weight);
		i=LocateVertex(G,v1);
		j=LocateVertex(G,v2);
		G->arcs[i][j].adj=weight;	
		k++;
	} 
	return(1);
}
6.1.2 邻接表
#define MAXSIZE 20//最多顶点个数
typedef int OtherInfo;
typedef enum{DG,DN,UDG,UDN
}GraphKind;//有向图 有向网 无向图 无向网 
typedef char VertexData;//顶点数据类型 
typedef struct ArcNode{
	int adjvex;//该弧指向顶点的位置 
	struct ArcNode * nextarc;//指向下一条弧的指针 
	OtherInfo info;//与该弧相关的信息 
}ArcNode;
typedef struct VertexNode{
	VertexData data;//顶点数据 
	ArcNode * firstarc;//指向该顶点第一条弧的指针 
}VertexNode; 
typedef struct{
	VertexNode vertex[MAXSIZE];
	int vexnum,arcnum;//图的顶点数和弧数 
	GraphKind kind;//图的种类标志 
}AdjList;
6.1.3 十字链表
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20//最多顶点个数
typedef enum{DG,DN,UDG,UDN
}GraphKind;//有向图 有向网 无向图 无向网 
typedef char VertexData;//顶点数据类型 
typedef struct ArcNode{
	int tailvex,headvex;//弧头/尾顶点在图中的位置 
	struct ArcNode * hlink,*tlink;//于此弧弧头/尾相同的下一条弧 
}ArcNode;
typedef struct VertexNode{
	VertexData data;//顶点数据 
	ArcNode * firstin,*firstout;//指向以该顶点作为弧头/尾的第一个弧顶点 
}VertexNode; 
typedef struct{
	VertexNode vertex[MAXSIZE];
	int vexnum,arcnum;
	GraphKind kind;
}OrthList;
int LocateVertex(OrthList *g,VertexData v)//求顶点位置函数 
{
	int j=-1,k;
	for(k=0;k<g->vexnum;k++)
		if(g->vertex[k].data==v)
		{
			j=k;
			break;
		}
	return(j); 
}
void CrtOrthList(OrthList *g)//创建图的十字链表 
{
	int n,e,i,j,k;
	char vh,vt;
	ArcNode* p;
	printf("请输入图的顶点个数和弧的个数:");
	scanf("%d,%d",&n,&e);
	g->vexnum=n;
	g->arcnum=e;
	printf("请输入顶点:");
	char ch=getchar();
	for(i=0;i<n;i++)
	{
		scanf("%c",&(g->vertex[i].data));
		printf("data=%c\n",g->vertex[i].data);
		g->vertex[i].firstin=NULL;
		g->vertex[i].firstout=NULL;
	}
	printf("请输入弧尾和弧头:"); 
	for(k=0;k<e;k++)
	{
		ch=getchar();
		scanf("%c,%c",&vt,&vh);
		i=LocateVertex(g,vt);
		j=LocateVertex(g,vh);
		p=(ArcNode*)malloc(sizeof(ArcNode));
		p->tailvex=i;
		p->headvex=j;
		p->tlink=g->vertex[i].firstout;
		g->vertex[i].firstout=p;
		p->hlink=g->vertex[j].firstin;
		g->vertex[j].firstin=p;
	}
}

6.2 图的遍历

6.2.1 深度优先搜索
6.2.2 广度优先搜索

6.3 图的应用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值