问题 填空题

[函数说明3.1]
假设以带头结点的单循环链表作非递减有序线性表的存储结构。函数deleteklist(LinkList head)的功能是删除表中所有数值相同的多余元素,并释放结点空间。
[函数3.1]
Void deleteklist (LinkList head)

LinkNode *p,*q;
p=head->next;
while (p!=head)

q=p->next;
while( (1) )

(2) ;
free(q);
q=p->next;

p=p->next;


[函数说明3.2]
已知一棵完全二叉树存放于一个一维数组T[n]中,T[n]中存放的是各结点的值。下面的程序的功能是:从T[0]开始顺序读出各结点的值,建立该二叉树的二叉链表表示。
[函数3.2]
#include<istream.h>
typedef struct node
int data;
stuct node leftChild,rightchild;
BintreeNode;
typedef BintreeNode *BinaryTree;
void ConstrucTree(int T[] , int n, int i, BintreeNode *&ptr)

if(i>=n) (3) ; /*置根指针为空*/
else

ptr=(BTNode*) malloc(sizeof(BTNode))
ptr->data=T[i];
ConstrucTree (T,n, 2*i+1, (4) );
ConstrucTree (T,n, (5) ,ptr->rightchild);


main(void)
/*根据顺序存储结构建立二叉链表*/
Binarytree bitree; int n;
printf("please enter the number of node: \n%s"; n);
int *A=(int*)malloc (n*sizeof (int)) ;
for (int i=0; i<n; i++) scanf("%d" ,A+i); /*从键盘输入结点值*/
for (int i=0; i<n; i++) printf("%d",A[i]);
ConstructTree (A,n, 0,bitree);

答案

参考答案:2*i+2

解析: 这一题共有两个程序,第一个函数是考查链表操作,第二个程序是使用递归法创建链式存储的二叉树。
先看第一个函数。这个函数由于while循环实现对链表的遍历,在这个while循环中又嵌套着一个while循环,内循环实现了删除相同元素的功能。由说明和程序可知,p指针指向当前遍历结点,q指向当前结点的后继结点,如果这两个结点的数据域相等,则将其删除。这个循环何时结束呢显然,当各结点的数据域不相等时要结束,或者当q指向链表头结点时,整个链表已经遍历完了也要结束,因此空(1)处应填写“q!=head && q->data==p->data”或其等价形式。如果指针p和指针q所指的结点的数据域相等,则要将指针q所指的结点删除,从内存中释放空间必须使指针q所指的结点的后继结点接到指针p所指的结点后,因此空(2)处应填写“p->next=q->next”。
再来分析第二个程序。这个程序由两个函数组成,函数main()实现数据输入,函数ConstrucTree(int T[],int n,int i,BintreeNode *&ptr)用于建立二叉链表。根据空(3)所在语句的注释,很容易填写空(3),当i>=n时,就说明二叉树不存这个结点,即将根指针置空,因此空(3)应填写“ptr=NULL”。当i<n时,先生成一个结点,将数组T[]第i个元素数据填入该结点,接下来建立结点的左子树和右子树。根据完全二叉树的顺序存储的定义,可以第i个元素左子树根结点为2*i+1,右子树的根结点为2*i+2。因此第一条递归调用是建立左子树,第二条递归调用是建立右子树。因此空(4)应填写“ptr->leftchild”,空(5)应填写“2*i+2”。

单项选择题
单项选择题