8-1 邻接表的应用场合 (20分)
问答题:使用邻接表存储无向图,为什么要足够稀疏才合算?
答:假设无向图有 n 个点,m 条边,每个点相连 因为邻接表储存无向图的时候,有 n 个顶点就要创建 n 个链表. 每个链表都会存和本顶点相关联的顶点,故每一条边会被存两次。故至少需 m* 2 个节点 而邻接矩阵无论图的稀疏程度,都需要 n*(n+1)/2 的空间存储。
课本P158;
8-2 邻接矩阵的边 (20分)
问答题:使用邻接矩阵存储无向图,如何查看i号顶点和j号顶点之间是否存在边?
无向图的邻接矩阵 A 是一个对称矩阵,每条边会表示两次,因此矩阵中对应位置 A[i][j] 或 A[j][i]是否为 1,若为 1 则判断有边,为 0 则判断无边。
课本P155;
8-3 二叉树先序遍历 (40分)
若采用以下的图示方式存储二叉树,请写出相应的类型定义,并写出基于你的类型定义的二叉树先序遍历算法。
struct BiTNode{
char data;
int lchild,rchild;
}Tree[100];
void preTraverse(int i){
if(i==-1) return ;
printf("%d",Tree[i].data);
preTraverse(Tree[i].lchild);
preTraverse(Tree[i].rchild);
}
int main(){
preTraverse(1);
}
8-4 邻接表的度 (5分)
问答题:使用邻接表存储有向图,如何求指定顶点的度?
假设有向图的邻接表如下: (课本P156-158)
#define MVNum 100 //最大顶点个数
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *nextarc; // 指向下一条弧的指针
OtherInfo info; // 该弧相关的信息,如权值等,若无信息可缺省
} ArcNode;
typedef struct VNode {
VerTexType data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧
} VNode, AdjList[MVNum];
typedef struct {
AdjList vertices;
int vexnum