//鄰接表 無向圖 深度搜索
#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);
}