#include <stdio.h>
#include<stdlib.h>
#define WItem int
typedef struct graph *Graph
struct graph
{
WItem NoEdge /*无边标记*/
int n/*顶点数*/
int e/*边数*/
WItem **a/*邻接矩阵*/
}AWDgraph
Graph Graphinit(int n,WItem noEdge) /*创建图*/
{
int i,j
Graph G=(struct graph *)malloc(sizeof (*G))
G->n=n
G->e=0
G->NoEdge=noEdge
a=(WItem**)malloc(sizeof(WItem)*n*n)
for(i=0i<G->n+1i++)
{
for (j=0j<G->n+1j++)
G->a[i][j]=G->NoEdge
}
return G
}
int GraphEdges(Graph(G)) /*输出边数*/
int GraphVertices(Graph(G)) /*输出顶点数*/
int GraphExist(int i,int j,Graph G) /*判断边是否存在*/
{
if(i<1||j<1||i>G->n||G->a[i][j]==G->NoEdge) return 0
return 1
}
void GraphAdd(int i,int j,WItem w,Graph G) /*加入一条边*/
{
if(i<1||j<1||i>G->n||G->n||i==j||G->a[i][j]!=G->NoEdge)
printf("Bad input")
G->a[i][j]=w
G->e++
}
void GraphDelete(int i,int j,Graph G) /*删除一条边*/
{
if(i<1||j<1||i>G->n||j>G->n||G->a[i][j]==G->NoEdge)
printf("Bad input")
G->a[i][j]=G->NoEdge
G->e--
}
int OutDegree(int i,Graph G) /*计算出度*/
{
int j,sum=0
if(i<1||i>G->n) printf("Bad input")
for(j=1j<=G->nj++)
if(G->a[i][j]!=G->NoEdge) sum++
return sum
}
int InDegree(int i,Graph G) /*计算入度*/
{
int j,sum=0
if(i<1||i>G->n) printf("Bad input")
for(j=1j<=G->nj++)
if(G->a[i][j]!=G->NoEdge) sum++
return sum
}
/*输出表*/
void GraphOut(Graph G)
{
int i,j
for(i=1i<=G->ni++)
{
for(j=1j<=G->nj++)
{printf("%d",G->a[i][j])
printf("\n")}
}
}
void main() /*测试该图类型数据结构算法*/
{
int p,q,n,e,i,j,w,noEdge
Graph G
noEdge=0
printf("几个结点\n")
scanf("%d",&n)
Graph Graphinit(int n,WItem noEdge)
printf("加入几条边\n")
scanf("%d",&e)
for(p=0p<ep++)
{
printf("边的权值为多少?")
scanf("%d",&w)
printf("在哪加边?")
scanf("%d,%d",&i,&j)
void GraphAdd(int i,int j, int w,Graph G)
}
for(i=1i<=G->ni++)
{
for(j=1j<=G->nj++)
printf("%d",G->a[i][j])
}
}
邻接表,存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。
对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点。
/* MGraph.cc: 图的邻接矩阵存储表示和实现 */
/* 包含图类型Graph定义;创建图;深度优先遍历;广度优先遍历 */
/* 用到引用型参数,在TC下无法通过编译,VC等C++编译器可通过 */
#include <stdio.h>
#include <string.h>
#include <limits.h> //含INT_MAX
#define VType char //顶点值类型
#define EType int //边权值类型
#define MAXVNUM 50 //最大顶点个数
#define DIGRAPH 0 //有向图(网)
#define UNDIGRAPH 1 //无向图(网)
#define INVALID INT_MAX //无效权值(最大整数表示无穷大)
#define EMPTY -1 //"空"顶点序号
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)