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

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

一、考研真题

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写成所有素因子乘积的形式,例如,

#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

测试代码:

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

测试结果:

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

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

链表结构定义:

typedef struct LNode
{
	int data;
	struct LNode* next;
 
}LNode,*LinkList;

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

//链表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的整数。

#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->datadata;
    if(T->rchild != NULL && flag){
        InOrderTraverse(T->rchild);
    }
    return flag;
}

参考文献:

https://blog.csdn.net/cckevincyh/article/details/78253112

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

你可能感兴趣的:(考研真题)