邻接链表法操作图

 

结点及其类型定义

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

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值