版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/84310265
文件操作比直接输入方便许多
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 20
/*邻接表的储存结构*/
typedef struct node /*表结点 或者 边表结点*/
{
int adjvex;
struct node *next;
}edgenode;
typedef struct vnode /*头结点*/
{
char vertex;
edgenode *firsteage;
}vertexnode;
typedef struct /*邻接表类型*/
{
vertexnode adjlist[M];
int n,e;
}linkedgraph;
int vis[M];
void creat (linkedgraph *g,int c)
{
int i,j,k;
edgenode *s;
FILE *f;
f=fopen("test.txt","r");
if(f)
{
fscanf(f,"%d%d",&g->n,&g->e);
for(i=0;i<g->n;i++)
{
fscanf(f,"%1s",&g->adjlist[i].vertex);
g->adjlist[i].firsteage=NULL;
}
for(k=0;k<g->e;k++)
{
fscanf(f,"%d%d",&i,&j);
s=(edgenode*)malloc(sizeof(edgenode));
s->adjvex=j;
s->next=g->adjlist[i].firsteage;
g->adjlist[i].firsteage=s;
if(c==0)
{
s=(edgenode*)malloc(sizeof(edgenode));
s->adjvex=i;
s->next=g->adjlist[j].firsteage;
g->adjlist[j].firsteage=s;
}
}
fclose(f);
}
else
{
g->n=0;
}
}
void dfs(linkedgraph g,int i)
{
edgenode *p;
printf("%c ",g.adjlist[i].vertex);
vis[i]=1;
p=g.adjlist[i].firsteage;
while(p)
{
if(!vis[p->adjvex])
{
dfs(g,p->adjvex);
}
p=p->next;
}
}
void DfsTraverse(linkedgraph g)
{
int i;
memset(vis,0,sizeof(vis));
printf("\nDFS:\n");
for(i=0;i<g.n;i++)
{
if(!vis[i])
{
dfs(g,i);
printf("\n");
}
}
printf("\n");
}
void bfs(linkedgraph g,int i)
{
int j;
edgenode *p;
int queue[M],front ,rear;
front=0;rear=0;
printf("%c ",g.adjlist[i].vertex);
vis[i]=1;
queue[rear++]=i;
while(rear>front)
{
j=queue[front++];
p=g.adjlist[j].firsteage;
while(p)
{
if(vis[p->adjvex]==0)
{
printf("%c ",g.adjlist[p->adjvex].vertex);
queue[rear++]=p->adjvex;
vis[p->adjvex]=1;
}
p=p->next;
}
}
}
//返回连通分量的个数
int BfsTraverse(linkedgraph g)
{
printf("BFS:\n");
int i,count=0;
memset(vis,0,sizeof(vis));
for(i=0;i<g.n;i++)
{
if(!vis[i])
{
count++;
bfs(g,i);
printf("\n");
}
}
return count;
}
void print(linkedgraph *g)
{
printf("\n\n输出:\n");
edgenode *p;
int i;
printf("一共有%d个结点,%d条边\n",g->n,g->e);
for(i=0;i<g->n;i++)
{
p=g->adjlist[i].firsteage;
printf("V%d -> ",i);
while(p)
{
printf("%d",p->adjvex);
if(p->next)
printf(" -> ");
p=p->next;
}
printf("\n");
}
}
int main ()
{
int count;
linkedgraph g;
creat(&g,0);
print(&g);
DfsTraverse(g);
count=BfsTraverse(g);
printf("一共有%d个连通分量\n",count);
return 0;
}
带权无向图的有区别的代码,有向图c=0即可。
typedef struct node /*表结点 或者 边表结点*/
{
int adjvex;
int data;
struct node *next;
}edgenode;
void creat (linkedgraph *g,int c)
{
int i,j,k,w;
edgenode *s;
FILE *f;
f=fopen("test.txt","r");
if(f)
{
fscanf(f,"%d%d",&g->n,&g->e);
for(i=0;i<g->n;i++)
{
fscanf(f,"%1s",&g->adjlist[i].vertex);
g->adjlist[i].firsteage=NULL;
}
for(k=0;k<g->e;k++)
{
fscanf(f,"%d%d%d",&i,&j,&w);
s=(edgenode*)malloc(sizeof(edgenode));
s->data=w;
s->adjvex=j;
s->next=g->adjlist[i].firsteage;
g->adjlist[i].firsteage=s;
if(c==0)
{
s=(edgenode*)malloc(sizeof(edgenode));
s->data=w;
s->adjvex=i;
s->next=g->adjlist[j].firsteage;
g->adjlist[j].firsteage=s;
}
}
fclose(f);
}
else
{
g->n=0;
}
}
void print(linkedgraph *g)
{
printf("\n\n输出:\n");
edgenode *p;
int i;
printf("一共有%d个结点,%d条边\n",g->n,g->e);
for(i=0;i<g->n;i++)
{
p=g->adjlist[i].firsteage;
printf("V%d -> ",i);
while(p)
{
printf("%d (w = %d)",p->adjvex,p->data);
if(p->next)
printf(" -> ");
p=p->next;
}
printf("\n");
}
}