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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值