C語言 無向圖的深度搜索

//鄰接表  無向圖   深度搜索

#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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章