图的存储结构主要分为邻接表存储与邻接矩阵存贮,我们先来实现一下邻接表存储。首先是邻接表的定义。
typedef struct ArcNode{
int ps;//节点的位置
struct ArcNode *next;
}ArcNode;
typedef struct ArcList{
int data;//节点所存储的信息
ArcNode *first;
}ArcList,Arc[Max];
typedef struct ALGraph{
Arc V;//tu
int vex,arc;//结点数目与边数
bool visited[Max];//是否已经被访问
}ALGraph;
需要定义一个邻接表,我们需要定义三个结构体,第一个结构体表示指向结点的信息(包括一个记录位置的整形变量与一个指向下一个结点的指针),第二个结构体表示结点的信息(data可以是int也可以是其他),第三个结构体表示这个图本身,包括图的节点数与边数,还有结点是否被访问的信息。
图的初始化:
图的初始化时,我们先输入图的结点数与边数,再利用for循环初始化visited与给结点赋初值(结点的信息),随后再根据边数进入for循环,确定结点的链接过程(1连接2,2连接3.....),随后根据结点的位置,将结点连接起来。
void InitALGraph(ALGraph &Ve){
scanf("%d",&Ve.vex);//输入结点数
scanf("%d",&Ve.arc);//bianshu
for(int i=0;i<Max;i++){
Ve.visited[i]=false;
}
for(int i=0;i<Ve.vex;i++){
scanf("%d",&Ve.V[i].data);//shurujiedianxinxi
Ve.V[i].first=NULL;
}
for(int i=0;i<Ve.arc;i++){
int x,y;
scanf("%d",&x);
scanf("%d",&y);
int temp1,temp2;
temp1=search(Ve,x);
temp2=search(Ve,y);
ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));
p->ps=temp2;
p->next=Ve.V[temp1].first;
Ve.V[temp1].first=p;
ArcNode *q=(ArcNode*)malloc(sizeof(ArcNode));
q->ps=temp1;
q->next=Ve.V[temp2].first;
Ve.V[temp2].first=q;
}
}
图的深度优先遍历:
void visit(ALGraph Ve,int ps){
ArcNode *p;
int j;
Ve.visited[ps]=true;
printf("Node is %d",Ve.V[ps].data);
printf("\n");
p=Ve.V[ps].first;
while(p!=NULL){
j=p->ps;
if(Ve.visited[j]==false){
visit(Ve,j);
}
p=p->next;
}
}
写的不是很详细,过几天会更新来补充。