#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;
}
数据结构C:邻接表的创建与DFS
猜你喜欢
转载自blog.csdn.net/qq_38827988/article/details/102495073
今日推荐
周排行