Пример #1
0
 void main()
 {
   int i,j,k,n;
   VertexType v1,v2;
   MGraph g;
   CreateFAG(&g);
   Display(g);
   printf("修改顶点的值,请输入原值 新值: ");
   scanf("%s%s",v1,v2);
   PutVex(&g,v1,v2);
   printf("深度优先搜索的结果:\n");
   DFSTraverse(g,visit);
   printf("广度优先搜索的结果:\n");
   BFSTraverse(g,visit);
   printf("删除一条边或弧,请输入待删除边或弧的弧尾 弧头:");
   scanf("%s%s",v1,v2);
   DeleteArc(&g,v1,v2);
   Display(g);
   DestroyGraph(&g);
   printf("请顺序选择有向图,有向网,无向图,无向网\n");
   for(i=0;i<4;i++) /* 验证4种情况 */
   {
     CreateGraph(&g);
     Display(g);
     printf("插入新顶点,请输入顶点的值: ");
     scanf("%s",v1);
     InsertVex(&g,v1);
     printf("插入与新顶点有关的弧或边,请输入弧或边数: ");
     scanf("%d",&n);
     for(k=0;k<n;k++)
     {
       printf("请输入另一顶点的值: ");
       scanf("%s",v2);
       if(g.kind<=1) /* 有向 */
       {
         printf("对于有向图或网,请输入另一顶点的方向(0:弧头 1:弧尾): ");
         scanf("%d",&j);
         if(j)
           InsertArc(&g,v2,v1);
         else
           InsertArc(&g,v1,v2);
       }
       else /* 无向 */
         InsertArc(&g,v1,v2);
     }
     Display(g);
     printf("删除顶点及相关的弧或边,请输入顶点的值: ");
     scanf("%s",v1);
     DeleteVex(&g,v1);
     Display(g);
     DestroyGraph(&g);
   }
 }
Пример #2
0
Status DeleteVex(MGraph &G, VertexType v)
{
	int i, j, k;

	k = LocateVex(G, v);
	if (k < 0)
		return ERROR;
	for (i = 0; i < G.vexnum; i++)
		DeleteArc(G, v, G.vexs[i]);
	if (G.kind < 2)
		for (i = 0; i < G.vexnum; i++)
			DeleteArc(G, G.vexs[i], v);
	for (j = k + 1; j < G.vexnum; j++)
		G.vexs[j - 1] = G.vexs[j];
	for (i = 0; i < G.vexnum; i++)
		for (j = k + 1; j < G.vexnum; j++)
			G.arcs[i][j - 1] = G.arcs[i][j];
	for (i = 0; i < G.vexnum; i++)
		for (j = k + 1; j < G.vexnum; j++)
			G.arcs[j - 1][i] = G.arcs[j][i];
	G.vexnum--;
	return OK;
}
Пример #3
0
 void main()
 {
   int i,j,k,n;
   ALGraph g;
   VertexType v1,v2;
   printf("请顺序选择有向图,有向网,无向图,无向网\n");
   for(i=0;i<4;i++) // 验证4种情况
   {
     CreateGraph(g);
     Display(g);
     printf("插入新顶点,请输入顶点的值: ");
     scanf("%s",v1);
     InsertVex(g,v1);
     printf("插入与新顶点有关的弧或边,请输入弧或边数: ");
     scanf("%d",&n);
     for(k=0;k<n;k++)
     {
       printf("请输入另一顶点的值: ");
       scanf("%s",v2);
       if(g.kind<=1) // 有向
       {
	 printf("对于有向图或网,请输入另一顶点的方向(0:弧头 1:弧尾): ");
	 scanf("%d",&j);
	 if(j)
	   InsertArc(g,v2,v1);
	 else
	   InsertArc(g,v1,v2);
       }
       else // 无向
	 InsertArc(g,v1,v2);
     }
     Display(g);
     if(i==3)
     {
       printf("删除一条边或弧,请输入待删除边或弧的弧尾 弧头:");
       scanf("%s%s",v1,v2);
       DeleteArc(g,v1,v2);
       printf("修改顶点的值,请输入原值 新值: ");
       scanf("%s%s",v1,v2);
       PutVex(g,v1,v2);
     }
     printf("删除顶点及相关的弧或边,请输入顶点的值: ");
     scanf("%s",v1);
     DeleteVex(g,v1);
     Display(g);
     DestroyGraph(g);
   }
 }
Пример #4
0
Status DeleteVex( AMLGraph *G , VertexType u )  //F**k you!
{
 int k ;
 int i , j ;
 EBox *p ;

 k = LocateVex( *G , u ) ;
 if( k < 0 )
  return ERROR ;

 for( i = 0 ; i < ( *G ).vexnum ; ++ i )
 {
  if( i == k )
   continue ;
  DeleteArc( G , u , ( *G ).adjmulist[ i ].data ) ;   //先删除含有顶点u的边结点
 }

 for( j = k + 1 ; j < ( *G ).vexnum ; ++ j )
  ( *G ).adjmulist[ j - 1 ] = ( *G ).adjmulist[ j ] ;

 -- ( *G ).vexnum ;

 for( j = k ; j < ( *G ).vexnum ; ++ j )  //修改顶点的序号
 {
  p = ( *G ).adjmulist[ j ].firstedge ;
  if( p )
  {
   if( p->ivex == j + 1 )    //? why ? OH!
   {
    -- p->ivex ;
    p = p->ilink ;
   }
   else // p->jvex == j + 1 .
   {
    -- p->jvex ;
    p = p->jlink ;
   }
  }
 }// for j
 return OK ;
}
Пример #5
0
 void main()
 {
   int j,k,n;
   OLGraph g;
   VertexType v1,v2;
   CreateDG(g);
   Display(g);
   printf("修改顶点的值,请输入原值 新值: ");
   scanf("%s%s",v1,v2);
   PutVex(g,v1,v2);
   printf("插入新顶点,请输入顶点的值: ");
   scanf("%s",v1);
   InsertVex(g,v1);
   printf("插入与新顶点有关的弧,请输入弧数: ");
   scanf("%d",&n);
   for(k=0;k<n;k++)
   {
     printf("请输入另一顶点的值 另一顶点的方向(0:弧头 1:弧尾): ");
     scanf("%s%d",v2,&j);
     if(j)
       InsertArc(g,v2,v1);
     else
       InsertArc(g,v1,v2);
   }
   Display(g);
   printf("删除一条弧,请输入待删除弧的弧尾 弧头:");
   scanf("%s%s",v1,v2);
   DeleteArc(g,v1,v2);
   Display(g);
   printf("删除顶点及相关的弧,请输入顶点的值: ");
   scanf("%s",v1);
   DeleteVex(g,v1);
   Display(g);
   printf("深度优先搜索的结果:\n");
   DFSTraverse(g,visit);
   printf("广度优先搜索的结果:\n");
   BFSTraverse(g,visit);
   DestroyGraph(g);
 }
Пример #6
0
Status DeleteVex(AMLGraph *G,VertexType v)
{ /* 初始条件: 无向图G存在,v是G中某个顶点 */
  /* 操作结果: 删除G中顶点v及其相关的边 */
  int i,j;
  VertexType w;
  EBox *p;
  i=LocateVex(*G,v); /* i为待删除顶点的序号 */
  if(i<0)
    return ERROR;
  for(j=0;j<(*G).vexnum;j++) /* 删除与顶点v相连的边(如果有的话) */
  {
    if(j==i)
      continue;
    strcpy(w,*GetVex(*G,j)); /* w是第j个顶点的值 */
    DeleteArc(G,v,w);
  }
  for(j=i+1;j<(*G).vexnum;j++) /* 排在顶点v后面的顶点的序号减1 */
    (*G).adjmulist[j-1]=(*G).adjmulist[j];
  (*G).vexnum--; /* 顶点数减1 */
  for(j=i;j<(*G).vexnum;j++) /* 修改顶点的序号 */
  {
    p=(*G).adjmulist[j].firstedge;
    if(p)
    {
      if(p->ivex==j+1)
      {
        p->ivex--;
        p=p->ilink;
      }
      else
      {
        p->jvex--;
        p=p->jlink;
      }
    }
  }
  return OK;
}