//邻接表 无向图 深度搜索
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
struct arcNode
{
int adjvex;//弧的终点位置
struct arcNode *nextarc;//指向下一个弧的指针
};
typedef struct vertexnode
{
int no;//顶点编号
struct arcNode *firstarc;
}AdjList[MAX_VERTEX_NUM];
struct graph
{
AdjList vertices;
int n,e;
};
//从文件sy4.txt中读取数据建立图
void createGraph(struct graph *&g)
{
int i,j,k;
struct arcNode *s=NULL;
g=(struct graph *)malloc(sizeof(struct graph));
if(g==NULL)
{
printf("内存分配错误!");
exit(0);
}
FILE *fp=NULL;
fp=fopen("sy4.txt","r");
if(!fp)
{
printf("打开文件错误!");
exit(0);
}
if(!feof(fp))
{
fscanf(fp,"%d%d",&g->n,&g->e);
for(i=0;i<g->n;i++)
{
fscanf(fp,"%d",&g->vertices[i].no);
g->vertices[i].firstarc=NULL;
}
}
printf("读取文件成功!\n顶点数为%d,边数为%d\n",g->n,g->e);
printf("顶点的编号为:");
for(i=0;i<g->n;i++)
printf("%d ",g->vertices[i].no);
printf("\n");
printf("相邻的结点为:\n");
if(!feof(fp))
{
for(k=0;k<g->e;k++)
{
fscanf(fp,"%d%d",&i,&j);
s=(struct arcNode *)malloc(sizeof(struct arcNode));
s->adjvex=j;
s->nextarc=g->vertices[i].firstarc;
g->vertices[i].firstarc=s;
s=(struct arcNode *)malloc(sizeof(struct arcNode));
s->adjvex=i;
s->nextarc=g->vertices[j].firstarc;
g->vertices[j].firstarc=s;
printf("%d-%d ",i,j);
}
}
printf("\n");
fclose(fp);
}
//输出邻接表
void diaplayAdjList(struct graph *g)
{
int i;
struct arcNode *s=NULL,*fs=NULL;
for(i=0;i<g->n;i++)
{
s=g->vertices[i].firstarc;
printf("%2d: ",i);
printf("%d-->",g->vertices[i].no);
while(s!=NULL)
{
fs=s;
printf("%d-->",s->adjvex);
s=s->nextarc;
}
printf("\n");
}
}
//从结点v开始深度搜索,visited[]数组用来标记每个结点是否已经访问
int visited[MAX_VERTEX_NUM];
void search(struct graph *g,int v)
{
struct arcNode *p=NULL;
visited[v]=1;
p=g->vertices[v].firstarc;
while(p!=NULL)
{
if(visited[p->adjvex]==0)
{
printf("<%d,%d> ",v,p->adjvex);
search(g,p->adjvex);
}
p=p->nextarc;
}
}
//释放本程序所有申请的内存
void clear(struct graph *g)
{
int i;
struct arcNode *s=NULL,*s1=NULL;
for(i=0;i<g->n;i++)
{
s=s1=g->vertices[i].firstarc;
while(s!=NULL)
{
s=s->nextarc;
free(s1);
s1=s;
}
}
}
void main(void)
{
struct graph *G=NULL;
createGraph(G);
printf("-------------------------------------------------------\n");
printf("邻接表为:\n"); diaplayAdjList(G);
//从结点3开始搜索
printf("测试1:深度搜索无向图search(G,3)\n"); search(G,3);
printf("\n");
//换个结点再次搜索前将每个结点都标记为没有访问
for(int i=0;i<G->n;i++)
visited[i]=0;
//从结点10开始搜索
printf("测试2:深度搜索无向图search(G,10)\n"); search(G,10);
printf("\n");
//调用自定义的释放内存函数
clear(G);
}