#include<stdio.h>
#include<stdlib.h>
struct edge{int v,w;}; //定义边的结构体,v,w为边的两个顶点;
edge EDGE(int v,int w){edge e; e.v=v;e.w=w; return e;}
struct graph{int V;int E; int**adj;}; //初始化一个二维数组来存储边的顶点
int **matrxint(int r,int c,int val){
int i,j;
int **t=(int**)malloc(sizeof(int*));
for(i=0;i<r;i++)
t[i]=(int*)malloc(sizeof(int));
for(i=0;i<r;i++)
for(j=0;j<c;j++)
t[i][j]=val;
return t;
}
graph* graphinit(int V){
graph *g=(graph*)malloc(sizeof(graph)); //图的初始化
g->V=V; g->E=0;
g->adj=matrxint(V,V,0);
return g;
}
void graphinsert(graph *g, edge e){ //插入顶点
int v=e.v,w=e.w;
if(g->adj[v][w]==0) g->E++;
g->adj[v][w]=1;
g->adj[w][v]=1;
}
void graphremove(graph *g,edge e){
int v=e.v,w=e.w; //删除顶点
if(g->adj[v][w]==1) g->E--;
g->adj[v][w]=0;
g->adj[w][v]=0;
}
int graphedges(edge a[],graph *g){
int v,w ,E=0;
for(v=0;v<g->V;v++)
for(w=v+1;w<g->V;w++) //统计边数
if(g->adj[v][w]==1)
a[E++]=EDGE(v,w);
return E;
}
void graphshow(graph *g){
int i,j;
printf("该图有%d顶点和%d边\n",g->V,g->E);
for(i=0;i<g->V;i++){
printf("%2d:",i);
for(j=0;j<g->V;j++) //显示邻接表
if(g->adj[i][j]==1) printf(" %2d",j);
printf("\n");
}
}
int main(){
int v,w;
printf("请输入顶点数:");
scanf("%d",&v);
graph *g=graphinit(v);
printf("请输入图中的顶点\n");
scanf("%d%d",&v,&w);
while(v!=-1 && w!=-1){
graphinsert(g,EDGE(v,w));
scanf("%d%d",&v,&w);
}
graphshow(g);
return 0;
}