您的位置:首页 > 理论基础

西南交通大学计算机专业考研真题答案详解11:2007年算法设计题

2018-11-11 20:05 459 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haimianjie2012/article/details/83961547

更多西南交通大学真题,参考:西南交通大学计算机考研——数据结构真题系列

一、考研真题

3、从键盘输入任意一个大于等于2的自然数m,将m写成所有素因子乘积的形式,例如,

    若输入:13,则你的输出应该: 13=13

     若输入:420,则你的输出应该是:420=2*2*3*5*7

4、编写一个算法将一个带头结点的单链表A分解成两个单链表A和B,使得A链表中含有原链表A中序号为奇数的元素,而B链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。

5、试编写一个算法,判断给定的二叉树是否是二叉排序树。假定二叉树种结点的为大于0的整数。

二、真题解析

3、从键盘输入任意一个大于等于2的自然数m,将m写成所有素因子乘积的形式,例如,

[code]#define QElemType int
#define MAXQSIZE 100
typedef struct
{
QElemType base[MAXQSIZE];
int rear;//指向循环队列中队尾元素的位置
int length;//表示队列中所含数据元素的个数
}SqQueue;
SqQueue Q;
void FactorFind(int num)
{
SqQueue m_q;
m_q.rear=0;
m_q.length=0;
int len=sqrt((float)num);
int m_num=num;
for (int i=2;i<=num;i++)
{
while (true)
{
if (m_num%i==0)
{
m_q.base[m_q.rear]=i;
m_q.rear++;
m_q.length++;
m_num=m_num/i;
}
else
{
break;
}
}
}
if (m_q.length==1)
{
printf("%d=%d\n",num,num);
}
if (m_q.length>=2)
{
printf("%d=%d",num,m_q.base[0]);
for (int i=1;i<m_q.length;i++)
{
printf("*%d",m_q.base[i]);
}
printf("\n");
}
}

测试代码:

[code]int _tmain(int argc, _TCHAR* argv[])
{
FactorFind(420);
FactorFind(13);
FactorFind(6);
int a=0;
return 0;
}

测试结果:

4、编写一个算法将一个带头结点的单链表A分解成两个单链表A和B,使得A链表中含有原链表A中序号为奇数的元素,而B链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。

链表结构定义:

[code]typedef struct LNode
{
int data;
struct LNode* next;

}LNode,*LinkList;

单链表A分解成单链表A和B:

[code]//链表A中结点按序号的奇偶性分解到表A或表B中
LNode* SeparateLNode(LNode* La)
{
LNode* Lb;
//记录表A中结点的序号
int m_num=0;
Lb=(LNode*)malloc(sizeof(LNode));
Lb->next=NULL;
//paTail,pbTail分别指向创建的La和Lb的尾结点
LNode *paTail,*pbTail,*pCur;
paTail=La;
pbTail=Lb;
pCur=La->next;
La->next=NULL;
while(pCur!=NULL)
{
m_num++;
if (m_num%2==0)
{
pbTail->next=pCur;
pbTail=pCur;
}
else
{
paTail->next=pCur;
pbTail=pCur;
}
pCur=pCur->next;
}//while

paTail->next=NULL;
pbTail->next=NULL;

return Lb;
}

类似考题:2010年第四题2011年第四题2014年第三题

5、试编写一个算法,判断给定的二叉树是否是二叉排序树。假定二叉树种结点的为大于0的整数。

[code]#define MIN  -256;
typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;

//判断一棵二叉树是不是二叉排序树
//思路:二叉排序树的特点是,若左子树非空,则左子树上结点的值均小于根结点的值;
//若右子树非空,则右子树上结点的值均大于根结点的值。所以根据这一特点,可以看出
//二叉排序树的中序遍历是一个递增序列。

int prev = MIN;
int flag = true;
bool InOrderTraverse(BiTree T)
{

if(T->lchild != NULL && flag)
{
InOrderTraverse(T->lchild);
}
if(T->data<prev)
{
flag = false;
}
prev = T->data;
if(T->rchild != NULL && flag){
InOrderTraverse(T->rchild);
}
return flag;
}

参考文献:

https://www.geek-share.com/detail/2719152922.html

更多西南交通大学真题,参考:西南交通大学计算机考研——数据结构真题系列

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: