邻接矩阵写起来还是比较简单的。。。。。。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define number 20 typedef struct node { int info; //图的节点存放的信息,可随时变动 }GraphNode; typedef struct { GraphNode matrix[number+1][number+1]; //构造邻接矩阵 int vexs[number+1]; //顶点向量 int vertex,edge; //顶点个数、弧个数 }Graph; //创建图 void CreatGraph(Graph *G) { int i,k; int x,y,data; int vertex,edge; printf("输入图的顶点个数和边的个数.\n"); scanf("%d%d",&vertex,&edge); G->vertex = vertex;G->edge = edge; printf("输入图的每个顶点.\n"); for(i=1;i<=vertex;i++) scanf("%d",&G->vexs[i]); for(i=1;i<=vertex;i++) for(k=1;k<=vertex;k++) G->matrix[i][k].info = 0; printf("请输入 %d 条边的横坐标、纵坐标、数值.\n",edge); for(i=1;i<=edge;i++) { scanf("%d%d%d",&x,&y,&data); G->matrix[x][y].info=data; } } //找出给定顶点的位置 int LocateVex(Graph *G,int V) { int i; for(i=1;i<=G->vertex;i++) if(G->vexs[i] == V) return i; return -1; //失败返回-1 } //将指定顶点的数值改变 void PutVex(Graph *G,int V,int value) { int temp; if((temp =LocateVex(G,V)) == -1)return; else G->vexs[temp] = value; } //找出指定顶点在图中的第一个邻接点 int FirstAdjVex(Graph *G,int V) { int temp,i; if((temp = LocateVex(G,V))==-1) return -1; //失败返回-1 else { for(i=1;i<=G->vertex;i++) if(G->matrix[temp][i].info != 0) return G->matrix[temp][i].info; } return -1; } //向图中插入一个顶点 int InsertVex(Graph *G,int V) { int i; G->vertex++; if(G->vertex > number)return 0; G->vexs[G->vertex] = V; for(i=1;i<=G->vertex;i++) G->matrix[G->vertex][i].info = 0; for(i=1;i<G->vertex;i++) G->matrix[i][G->vertex].info = 0; return 1; } //在图中删除一个顶点 int DeleteVex(Graph *G,int V) { int i,temp,k; int count=0; if((temp=LocateVex(G,V)) == -1)return -1; //顶点数组变化 for(i=temp;i<G->vertex;i++) G->vexs[i] = G->vexs[i+1]; //顶点入度变化 for(i=1;i<=G->vertex;i++) { if(G->matrix[i][temp].info)count++; for(k=temp;k<G->vertex;k++) { G->matrix[i][k].info=G->matrix[i][k+1].info; } } //顶点出度变化 for(i=1;i<G->vertex;i++) { for(k=temp;k<G->vertex;k++) G->matrix[k][i].info = G->matrix[k+1][i].info; } G->vertex--; //顶点减一 G->edge -= count; //弧减去对应的个数 return 1; } //在图中插入一条弧 int InsertArc(Graph *G,int v,int w) { int digit; if(v<0||v> G->vertex||w<0||w>G->vertex)return -1; printf("输入弧的权值.\n"); scanf("%d",&digit); G->matrix[v][w].info = G->matrix[w][v].info = digit; return 1; } //在图中删除一条弧 int DeleteArc(Graph *G,int v,int w) { if(v<0||v> G->vertex||w<0||w>G->vertex)return -1; G->matrix[v][w].info = G->matrix[w][v].info = 0; return 1; } //打印图 void DisplayGraph(Graph *G) { int i,k; for(i=1;i<=G->vertex;i++) { for(k=1;k<=G->vertex;k++) printf("%-4d ",G->matrix[i][k].info); printf("\n"); } printf("\n"); } void RecoverGraph(Graph *G) { int i,k; for(i=1;i<=G->vertex;i++) for(k=1;k<=G->vertex;k++) G->matrix[i][k].info=0; memset(G->vexs,0,sizeof(G->vexs)); G->vertex = G->edge = 0; } int main() { Graph G; CreatGraph(&G); DisplayGraph(&G); printf("%d\n",LocateVex(&G,4)); printf("%d\n",FirstAdjVex(&G,4)); InsertVex(&G,34); DeleteVex(&G,4); DisplayGraph(&G); return 0; }