数据结构C:邻接表的创建与DFS

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define maxSize 5
//邻接表结构 
//边的结构 
struct ArcNode{
	//该顶点的下一条边 
	struct ArcNode *nextArc;
	//这条边所指向的结点的位置,数组下标 
	int adjvex;
};
//顶点结构 
struct VNode{
	//顶点的第一条边 
	ArcNode *fristArc;
	int data;
};
struct AGraph{
	//顶点数组 
	VNode* adjlist[maxSize];
	int n,e;
};
//构造邻接表
void createGraph(AGraph *&g,int a[],int n){
	//初始化
	int tip;
	g = (AGraph*)malloc(sizeof(AGraph));
	g->e = 0;
	g->n = n;
	for(int i = 0;i < n;++i){
		VNode* v = (VNode*)malloc(sizeof(VNode));
		v->data = a[i];
		v->fristArc = NULL;
		g->adjlist[i] = v;
	}
	for(int i=0;i<n;++i){
		VNode* v = g->adjlist[i];
		//具体录入单个边的信息 
		printf("Please Input Node:%d Message\n",v->data);
		//用来记录上一条边 
		ArcNode* priorArc = NULL; 
		int adjvex = 0;
		while(1){
			
			printf("Node:%d Message\n",v->data);
			printf("IF Input -1 represent end\n");
			printf("Node:%d point->:",v->data);
			scanf("%d",&adjvex);
			if(adjvex == -1){
				break;
			} 
			ArcNode* arc = (ArcNode*)malloc(sizeof(ArcNode));
			arc->adjvex = 0;
			arc->nextArc = NULL;
			
			g->e++;
			//这里减一的原因是因为,我们的  g->adjlist[i]是从0开始的,用户虽然是输入了结点1,但是计算机中是计入了数组的第0个下标的值 
			arc->adjvex = adjvex-1;
			//第一条边的处理 
			if(priorArc == NULL){
				v->fristArc = arc;
				printf("%d指向->%d\n",v->data,v->fristArc->adjvex);
			}
			//顶点的下一条边y
			if(priorArc != NULL){
				priorArc->nextArc = arc;
				printf("%d指向->%d\n",v->data,arc->adjvex);
			}
			priorArc = arc;
		}
		printf("\n");
		printf("\n");
		printf("\n");
	}
} 
void show(int v){
	printf("%d",v+1);
}
void search(int a[]){
	for(int i=0;i<maxSize;i++){
		printf("%d",a[i]);
	}
	printf("\n");
}
int visit[maxSize];
void DFS(AGraph* g,int v){
	ArcNode* p;
	visit[v] = 1;
	show(v);
	p = g->adjlist[v]->fristArc;
	while(p!=NULL){
		if(visit[p->adjvex]==0){
			DFS(g,p->adjvex);
		}
		p = p->nextArc;
	}
}

int main(){
	AGraph* g = NULL;
	int a[] = {1,2,3,4,5};
	createGraph(g,a,maxSize);
	DFS(g,0);
	return 0;
}
发布了94 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38827988/article/details/102495073