版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haimianjie2012/article/details/83713462
一、考研真题
1、下面是求两个集合A和B的并集(AUB)的算法,集合A和集合B分别用单链表La和Lb的带头结点的单链表表示(链表中的数据按升序排序),其并集用单链表Lc表示(带头结点,其数据也按升序排列),请填空完善算法。(每空2分)。
2、对给定的带头结点的单链表L,结点值得类型为整型,编写一个删除L中值为x的算法(L中可能有多个值为x的结点,且值得分布具有随机性)。(6分)
3、假设将循环队列定义为:
typedef struct
{
QElemType *base;
int rear;//指向循环队列中队尾元素的位置
int length;//表示队列中所含数据元素的个数
}SqQueue;
SqQueue Q;
试给出次循环队列的队满条件,并写出相应的入队列和出队列算法(在出队列的算法中要返回队头元素)。(8分)
4、编写一个递归算法,计算以二叉树表示的二叉树T的高度h。(6分)
二、真题解析
2、对给定的带头结点的单链表L,结点值得类型为整型,编写一个删除L中值为x的算法(L中可能有多个值为x的结点,且值得分布具有随机性)。(6分)
typedef struct LNode
{
int data;
struct LNode* next;
}LNode,*LinkList;
void DeleteLNode(LNode* &L,int x)
{
if (L==NULL)
{
return;
}
LNode *p,*q;
p=L;
while(p->next!=NULL)
{
if (p->next->data==x)
{
q=p->next;
p->next=q->next;
free(q);
}else{
p=p->next;
}
}
}
3、试给出次循环队列的队满条件,并写出相应的入队列和出队列算法(在出队列的算法中要返回队头元素)。(8分)
//入队
int EnCQueue(SqQueue &Q, QElemType x)
{
if(Q.length == MAXQSIZE){
return -1;//循环队列满
}
Q.base[Q.rear] = x;
Q.rear=(Q.rear+1)%MAXQSIZE;
++Q.length;//当前元素个数+1
return 0;
}
//出队
int DeCQueue(SqQueue &Q, QElemType &x)
{
if(Q.length==0){
return -1;//循环队列空
}
int font=(Q.rear+MAXQSIZE-Q.length)%MAXQSIZE;
x = Q.base[font];
--Q.length;//当前元素个数-1
return 0;
}
4、编写一个递归算法,计算以二叉树表示的二叉树T的高度h。(6分)
int Heigh(BTNode* btree)
{
if (btree == NULL)
{
return 0;
}
int lheight, rheight;
lheight = Heigh(btree->lchild);
rheight = Heigh(btree->rchild);
if (lheight>rheight)
{
return lheight + 1;
}
else {
return rheight + 1;
}
}