2009年《数据结构》试卷A答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西华大学课程考试参考答案(A卷)
课程代码: 8401801 试卷总分: 100 分
一、单项选择题参考答案及评分标准:(本大题共20个小题,每小题2分,共40分)
评分标准:选对一题得2分,不选或选错得0分。
1-5:CBACC 6-10:CCBDB 11-15:ABCCD 16-20:CADDC
二、算法理解题参考答案及评分标准:(本大题共3个小题,第1、2小题各7分,第3小题6分,共20分)
评分标准:请根据各解答步骤酌情给分。
1. 解:构造过程各图(略),最后结果为:
2. 解:设权w=(5,29,7,8,14,23,3,11),可构造一棵赫夫曼树如下图所示。
所得赫夫曼编码为:
A: 0110
B: 10
C: 1110
D: 1111
E: 110
F: 00
G: 0111
H: 010
3. 解:
(1)希尔排序
第一趟(增量d=5)排序后 7、12、36、23、12、51、60、55、72、49
第二趟(增量d=3)排序后 7、12、36、23、12、51、49、55、72、60
第三趟(增量d=1)排序后 7、12、12、23、36、49、51、55、60、72
(2)归并排序
第一趟排序后 12、51、23、55、7、49、36、60、12、72
第一趟排序后 12、23、51、55、7、36、49、60、12、72
第三趟排序后 7、12、23、36、49、51、55、60、12、72
第四趟排序后 7、12、12、23、36、49、51、55、60、72
三、算法设计题参考答案及评分标准:(本大题共4个小题,每小题10分,共40分)
评分标准:请根据编程情况酌情给分。
1. 参考答案示例:
void DelInsert(LinkList &L)
{∥本算法将带头结点的非空单链表L中数据域值最小的那个结点移到链表的最前面。
p=L->next;∥p是链表的工作指针
pre=L;∥pre指向链表中数据域最小值结点的前驱。
q=p;∥q指向数据域最小值结点,初始假定是首元结点
while (p->next!=NULL)
{ if(p->next->data<q->data){ pre=p;q=p->next;} ∥找到新的最小值结点 p=p->next;
}
if (q!=L->next)
{ pre->next=q->next;∥将最小值结点从链表上摘下
q->next= L->next;∥将q结点插到链表最前面
L->next=q;
}
}//DelInsert
2. 参考答案示例:
void Count(BiTree T,int &n0,int &n)
{//统计二叉树T上叶结点数n0和非叶结点数n。
if(T)
{ if (T->lchild== NULL && T->rchild== NULL) n0++;//叶结点
else n++; //非叶结点
Count(T->lchild, n0, n);
Count(T->rchild, n0, n);
}
}//Count
3. 参考答案示例:
int visited[]=0; //全局变量,访问数组初始化
flag=0;
int Path_DFS(ALGraph G, int vi)
{//以邻接表为存储结构的有向图G,深度优先判断G中顶点Vi到Vj是否有通路。
//返回1或0表示有或无。
假设顶点的信息就是顶点编号。
visited[vi]=1;
p=G.vertices[vi].firstarc; //第一个邻接点。
while (p&&!flag)
{ k=p->adjvex;
if (k==vj) { flag=1; return(1);} //vi 到vj 有通路。
if (visited[k]==0) Path_DFS(G,k);
p=p->nextarc; }
if (!flag) return(0);
}// Path_DFS
4. 参考答案示例:
typedef struct
{ int num;
float score;
}RecType;
void SelectSort(RecType R[51])
{ //按成绩由高到低的次序输出50个学生的记录。
for(i=1; i<50; i++)
{ //选择第i大的记录,并交换到位
k=i; //假定第i个元素的关键字最大 for(j=i+1;j<=n;j++) //找最大元素的下标 if(R[j].score>R[k].score) k=j;
if(i!=k) R[i] <-->R[k]; //与第i个记录交换}//for
for(i=1; i<=50; i++) //输出成绩
{ printf("%d,%f\n",R[i].num,R[i].score); } }//SelectSort。