结点及其类型定义
#define MAX_VEX 30 /* 最大顶点数 */
typedef int InfoType;
typedef enum {DG, AG, WDG,WAG} GraphKind ;
typedef struct LinkNode
{
int adjvex ; // 邻接点在头结点数组中的位置(下标)
InfoType info ; // 与边或弧相关的信息, 如权值
struct LinkNode *nextarc ; // 指向下一个表结点
}LinkNode ; /* 表结点类型定义 */
typedef struct VexNode
{
VexType data; // 顶点信息
int indegree ; // 顶点的度, 有向图是入度或出度或没有
LinkNode *firstarc ; // 指向第一个表结点
}VexNode ; /* 顶点结点类型定义 */
typedef struct ArcType
{
VexType vex1, vex2 ; /* 弧或边所依附的两个顶点 */
InfoType info ; // 与边或弧相关的信息, 如权值
}ArcType ; /* 弧或边的结构定义 */
typedef struct
{
GraphKind kind ; /* 图的种类标志 */
int vexnum ;
VexNode AdjList[MAX_VEX] ;
}ALGraph ; /* 图的结构定义 */
(1) 图的创建
ALGraph *Create_Graph(ALGraph * G)
{
printf(“请输入图的种类标志:”) ;
scanf(“%d”, &G->kind) ;
G->vexnum=0 ; /* 初始化顶点个数 */
return(G) ;
}
(2) 图的顶点定位
图的顶点定位实际上是确定一个顶点在AdjList数组中的某个元素的data域内容。
int LocateVex(ALGraph *G , VexType *vp)
{
int k ;
for (k=0 ; k<G->vexnum ; k++)
if (G->AdjList[k].data==*vp) return(k) ;
return(-1) ; /* 图中无此顶点 */
}
(3) 向图中增加顶点
向图中增加一个顶点的操作,在AdjList数组的末尾增加一个数据元素。
int AddVertex(ALGraph *G , VexType *vp)
{
int k , j ;
if (G->vexnum>=MAX_VEX)
{
printf(“Vertex Overflow !\n”) ;
return(-1) ;
}
if (LocateVex(G , vp)!=-1)
{
printf(“Vertex has existed !\n”) ;
return(-1) ;
}
G->AdjList[G->vexnum].data=*vp ;
G->AdjList[G->vexnum].degree=0 ;
G->AdjList[G->vexnum].firstarc=NULL ;
k=++G->vexnum ;
return(k) ;
}
(4) 向图中增加一条弧
根据给定的弧或边所依附的顶点,修改单链表:无向图修改两个单链表;有向图修改一个单链表。
int AddArc(ALGraph *G , ArcType *arc)
{
int k , j ;
LinkNode *p ,*q ;
k=LocateVex(G , &arc->vex1) ;
j=LocateVex(G , &arc->vex2) ;
if (k==-1||j==-1)
{
printf(“Arc’s Vertex do not existed !\n”) ;
return(-1) ;
}
p=(LinkNode *)malloc(sizeof(LinkNode)) ;
p->adjvex=arc->vex1 ;
p->info=arc->info ;
p->nextarc=NULL ; /* 边的起始表结点赋值 */
q=(LinkNode *)malloc(sizeof(LinkNode)) ;
q->adjvex=arc->vex2 ;
q->info=arc->info ;
q->nextarc=NULL ; /* 边的末尾表结点赋值 */
if (G->kind==AG||G->kind==WAG)
{
q->nextarc=G->adjlist[k].firstarc ;
G->adjlist[k].firstarc=q ;
p->nextarc=G->adjlist[j].firstarc ;
G->adjlist[j].firstarc=p ;
} /* 是无向图, 用头插入法插入到两个单链表 */
else /* 建立有向图的邻接链表, 用头插入法 */
{
q->nextarc=G->adjlist[k].firstarc ;
G->adjlist[k].firstarc=q ; /* 建立正邻接链表用 */
//q->nextarc=G->adjlist[j].firstarc ;
//G->adjlist[j].firstarc=q ; /* 建立逆邻接链表用 */
}
return(1);
}