📄 algo7-1.c
字号:
/* algo7-1.c 调用算法7.7、7.8 */
#include"c1.h"
#define MAX_NAME 2 /* 顶点字符串的最大长度+1 */
typedef char ElemType[MAX_NAME];
typedef ElemType TElemType;
#include"c6-5.h"
typedef int InfoType;
typedef char VertexType[MAX_NAME];
#include"c7-2.h"
#include"bo7-2.c"
void DFSTree(ALGraph G,int v,CSTree *T)
{ /* 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8 */
Boolean first=TRUE;
int w;
CSTree p,q;
VertexType v1,w1;
visited[v]=TRUE;
strcpy(v1,*GetVex(G,v));
for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,strcpy(w1,*GetVex(G,w)))) /* w依次为v的邻接顶点 */
if(!visited[w]) /* w顶点不曾被访问 */
{
p=(CSTree)malloc(sizeof(CSNode)); /* 分配孩子结点 */
strcpy(p->data,*GetVex(G,w));
p->firstchild=NULL;
p->nextsibling=NULL;
if(first)
{ /* w是v的第一个未被访问的邻接顶点 */
(*T)->firstchild=p;
first=FALSE; /* 是根的第一个孩子结点 */
}
else /* w是v的其它未被访问的邻接顶点 */
q->nextsibling=p; /* 是上一邻接顶点的兄弟姐妹结点 */
q=p;
DFSTree(G,w,&q); /* 从第w个顶点出发深度优先遍历图G,建立子生成树q */
}
}
void DFSForest(ALGraph G,CSTree *T)
{ /* 建立无向图G的深度优先生成森林的(最左)孩子(右)兄弟链表T。算法7.7 */
CSTree p,q;
int v;
*T=NULL;
for(v=0;v<G.vexnum;++v)
visited[v]=FALSE; /* 赋初值 */
}
void PreOrderTraverse(CSTree T,void(*Visit)(TElemType))
{ /* 先根遍历孩子-兄弟二叉链表结构的树T(bo6-5.c改) */
if(T)
{
Visit(T->data); /* 先访问根结点 */
PreOrderTraverse(T->firstchild,Visit); /* 再先根遍历长子子树 */
PreOrderTraverse(T->nextsibling,Visit); /* 最后先根遍历下一个兄弟子树 */
}
}
void print(char *i)
{
printf("%s ",i);
}
void main()
{
ALGraph g;
CSTree t;
printf("请选择无向图\n");
CreateGraph(&g);
Display(g);
DFSForest(g,&t);
printf("先根遍历生成森林:\n");
PreOrderTraverse(t,print);
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -