1.6
1.选择题: ⑴ C ⑵ C ⑶ A
习题与上机操作
C B C⑷ ⑸ ⑹
2.填空题: ⑴ 一对一 一对多 多对多 ⑵ 算法的时间效率 算法的空间效率 ⑶ 线性结构 非
线性结构 ⑷ 顺序存储 链式存储 索引存储 散列存储 ⑸ 字 ⑹ 有穷性 确定性 ⑺ n*(n+1)/2 3
O(n ) 3. ⑻ 分析题: 4⑴ ⑵ .应用题: ⑴ 答案 ⑵ ⑶ 答案: 答案:
5.操作题 ⑴ 已知一棵二叉树按顺序方式存储在数组 A[1..n]中。设计算法,求出下标分别
为 i 和 j 的两个结点的最近的公共祖先结点的值。 ①编程思想:二叉树顺序存储,是按完
全二叉树的格式存储,利用完全二叉树双亲结点 与孩子结点编号间的关系,求下标为 i 和
j 的两结点的双亲,双亲的双亲等,直至找到最近 的公共祖先。 ② C 源程序: typedef int
ElemType; void Ancestor(ElemType A[],int i ,int j) { while(i!=j) if(i>j) i=i/2; else j=j/2; printf("所
查结点的最近公共祖先的下标是%d,值是%d",i,A[i]); }
main() /* 从下标为 1 的单元存放树结点 */ {int A[14]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; int
i,j; scanf("%d%d",&i,&j); Ancestor(A,i,j); } ⑵ 假设以双亲表示法作树的存储结构,写出双亲
表示的类型说明,并编写求给定的树的深 度的算法(注:已知树中结点数) ① 编程思想:由
于以双亲表示法作树的存储结构,找结点的双亲容易。因此我们可求出 每一结点的层次,
取其最大层次就是树的深度。对每一结点,找其双亲,双亲的双亲,直至 结点双亲为 0 为
止 。 ② C 源 程 序 : #define MAX_SIZE 100 typedef int ElemType; typedef struct
PTNode{ ElemType data; int parent;}PTNode; typedef struct{ PTNode nodes[MAX_SIZE]; int
n;}PTree; int Depth(PTree t) /* 求 树 高 */ {int maxdepth=0; int i,f,temp; for(i=1;i<=t.n;i++)
{temp=0; f=i-1; while(f>=0) {temp++; f=t.nodes[f].parent; } if(temp>maxdepth) maxdepth=temp;
} return(maxdepth); } main() {int i,x,a,b; PTree t; scanf("%d ",&x); t.n=x; for(i=0;i<=t.n-1;i++)
{scanf("%d %d",&a,&b); t.nodes[i].data=a; t.nodes[i].parent=b;
} printf("树的高度为:%d",Depth(t)); }
2.7 习题与上机操作
⒈ ⒉ ⑴ ⑵ ⑶ ⑷ ⑸ ⒊ ⑴ 选择题 ⑴ B ⑵ C ⑶ C A ⑷ ⑸ A
填空题 114 物理结构 指向后继的指针 n-i head->next=NULL 线性链表、循环链表、双向链
表 简答题 试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。 答:
开始结点是指链表中的第一个结点,也就是没有直接前趋的那个结点。 链表的头指针是一
指向链表开始结点的指针(没有头结点时),单链表由头指针唯一确 定,因此单链表可以用
头指针的名字来命名。 头结点是在链表的开始结点之前附加的一个结点。 有了头结点之后,
头指针指向头结点, 不论链表否为空, 头指针总是非空。 而且头指针的设置使得对链表
的第一个位置上的操作与 在表其他位置上的操作一致(都是在某一结点之后)。 ⑵ 在顺序表
中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个 因素? 答:在
等概率情况下,顺序表中插入一个结点需平均移动 n/2 个结点。删除一个结点需 平均移动
(n-1)/2 个结点。 具体的移动次数取决于顺序表的长度 n 以及需插入或删除的位置 i。 i 越
接近 n 则所需移动的结点数越少。 ⑶ 为什么在单循环链表中设置尾指针比设置头指针更好?
答: 尾指针是指向终端结点的指针, 用它来表示单循环链表可以使得查找链表的开始结
点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为 rear,则开始结点和终
端 结点的位置分别是 rear->next->next 和 rear, 查找时间都是 O(1)。 若用头指针来表示该链
表,则查找终端结点的时间为 O(n)。 ⑷ 何时选用顺序表、何时选用链表作为线性表的存