结点及其类型定义

#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);

}

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐