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