一、图的邻接矩阵存储
1.存储表示
#define vexnum 10
typedef struct{
vextype vexs[vexnum];
int arcs[vexnum][vexnum];
}mgraph;
2.建立无向图的邻接矩阵算法
void creat(mgraph *g, int e){
for(i=0;i<vexnum;i++)
scanf(“%c”,&g->vexs[i]);
for(i=0;i<vexnum;i++)
for(j=0;j<vexnum;j++)
g->arcs[i][j]=0;
for(k=0;k<e;k++){
scanf(“%d,%d”,&i,&j);
g->arcs[i][j]=1; g->arcs[j][i]=1;} }
3.建立有向图的邻接矩阵算法
void creat(mgraph *g, int e){
for(i=0;i<vexnum;i++)
scanf(“%c”,&g->vexs[i]);
for(i=0;i<vexnum;i++)
for(j=0;j<vexnum;j++)
g->arcs[i][j]=0;
for(k=0;k<e;k++){
scanf(“%d,%d,%d”,&i,&j,&w);
g->arcs[i][j]=w; }
}
二、图的邻接表存储
1.邻接表存储表示
#define vexnum 10
typedef struct arcnode{
int adjvex;
struct arcnode *nextarc;
}Arcnode;
typedef struct vnode{
vextype data;
Arcnode *firstarc;
}Vnode;
typedef struct{
Vnode vertices[vexnum];
int vexnum,arcnum;
}algraph;
2.建立无向图的邻接表算法:
void creat(algraph *g, int e){
for(i=0;i<vexnum;i++){
scanf(“%c”,&g->vertices[i]->data);
g->vertices[i]->firstarc=NULL;}
for(k=0;k<e;k++){
scanf(“%d,%d”,&i,&j);
q=(Arcnode *)malloc(sizeof(Arcnode)); p=(Arcnode *)malloc(sizeof(Arcnode)); p->adjvex=j;
p->nextarc=g->vertices[i]->firstarc;
g->vertices[i]->firstarc=p;
q->adjvex=i;
q->nextarc=g->vertices[j]->firstarc;
g->vertices[j]->firstarc=q; }
}
3.建立有向图邻接表算法:
void creat(algraph *g, int e){
for(i=0;i<vexnum;i++){
scanf(“%c”,&g->vertices[i]->data);
g->vertices[i]->firstarc=NULL;}
for(k=0;k<e;k++){
scanf(“%d,%d”,&i,&j);
p=(Arcnode *)malloc(sizeof(Arcnode)); p->adjvex=j;
p->nextarc=g->vertices[i]->firstarc;
g->vertices[i]->firstarc=p; }
}
三、图的遍历
1.连通图的深度优先搜索遍历
int visited[vexnum]={0};
void dfs(mgraph *g, int i){
printf(“%3c”,g->vexs[i]);
visited[i]=1;
for(j=0;j<vexnum;j++)
if((g->arcs[i][j]==1)&&(!visited[j]))
dfs(g, j); }
2.联通图的广度优先搜索遍历
int visited[vexnum]={0};
void bfs(mgraph *g, int k){
int q[20], f, r;
f=0; r=0;
printf(“%3c”,g->vexs[k]);
visited[k]=1;
q[r]=k; r++;
while(r!=f){
i=q[f]; f++;
for(j=0;j<vexnum;j++)
if((g->arcs[i][j]==1)&&!visited[j]){
printf(“%3c”,g->vexs[j]);
visited[j]=1;
q[r]=j; r++;}
}
}
4.求图的联通分量
int visited[vexnum]={0};
void component(mgraph *g){
int count=0;
for(j=0;j<vexnum;j++)
if(!visited[j]){
count++;
printf(“\n第%d个联通分量:”, count);
dfs(g, j); }
printf(“\n 共有%d个联通分量。
\n”, count); }。