西南交通大学计算机专业考研真题答案详解1:2017年数据结构算法与程序设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haimianjie2012/article/details/83005467

西南交通大学计算机专业考研真题:2017年数据结构算法与程序设计

一、考研题目

1.设某堆栈的存储结构定义如下,请按要求完成如下问题。(10分)

Typedef struct{

   int *base;//栈底指针

   int *top;//栈顶指针

   int stacksize;//堆栈大小

}SqStack;

(1)编写程序穿点一个大小为256K的堆栈。(4分)

(2)编写程序将堆栈中的元素按照栈底到栈顶从小到大的顺序排列。要求每次堆栈的操作必须符合堆栈的要求。(6分)

2.某二叉树采用二叉链表的存储结构,请编写程序实现二叉树中所有节点的左右子树互换。要求:(12分)

(1)写出二叉树二叉链表的存储结构定义。(2分)

(2)基于(1)中的存储结构,编写函数创建一个二叉树,实现二叉树结点信息的录入。(4分)

(3)编写函数实现二叉树中所有结点的左右子树互换。(6分)

3.某序列采用链式存储结构进行存储,请编写程序采用直接插入排序算法实现该序列按从小到大的顺序排列。要求(共8分)

(1)定义链表的存储结构。(2分)

(2)编写函数采用直接插入排序算法将该序列按从小到大的顺序排列。(6分)

二、真题解析

1.第一题

1.设某堆栈的存储结构定义如下,请按要求完成如下问题。(10分)

Typedef struct{

   int *base;//栈底指针

   int *top;//栈顶指针

   int stacksize;//堆栈大小

}SqStack;

(1)编写程序穿点一个大小为256K的堆栈。(4分)

(2)编写程序将堆栈中的元素按照栈底到栈顶从小到大的顺序排列。要求每次堆栈的操作必须符合堆栈的要求。(6分)

Sqstack* sort(Sqstack &stack)
{
	Sqstack* res=NULL;
	if (stack.top==stack.base)
	{
		//如果栈为空,直接返回
		return res;
	}
	/*书上的用法编译出错,因为VC++不支持变长数组
	数组必须声明为定长数组如a[4],或者使用new来创建动态数组
	*/
	int len = stack.stacksize;
	//为数组a分配内存空间
	int *a = new int[len];

	//将栈中元素拷贝到数组中
	int i = 0;
	while (stack.base!=stack.top)
	{
		a[i] = *stack.top;
		//top指向下一个元素
		--stack.top;
		i++;
	}

    //对数组a中的元素进行排序
	for (int  i = 0; i < len; i++)
	{
		for (int j = i+1; j < len; j++)
		{
			//栈底到栈顶从小到大,所以a[0]最大
			if (a[i]<a[j])
			{
				int tmp = a[j];
				a[j] = a[i];
				a[i] = tmp;
			}
		}
	}
		
	//初始化栈为空栈
	res = new Sqstack();
	res->base = res->top;
	res->stacksize = 0;
	//将数组中的元素拷贝到栈结构中
	for (int i = 0; i < len; i++)
	{
		*res->top = a[i];
		res->top++;
		res->stacksize++;
	}
	//释放数组a的内存空间
	delete[] a;
	return res;
}

2.第二题

2.某二叉树采用二叉链表的存储结构,请编写程序实现二叉树中所有节点的左右子树互换。要求:(12分)

(1)写出二叉树二叉链表的存储结构定义。(2分)

(2)基于(1)中的存储结构,编写函数创建一个二叉树,实现二叉树结点信息的录入。(4分)

(3)编写函数实现二叉树中所有结点的左右子树互换。(6分)

(1)二叉树二叉链表的存储结构定义

第一小问,比较基础,直接考的课本上面的定义:

typedef struct BiTree{
	int data;
	struct BiTree *lchild, *rchild;//左右孩子指针
}BiTree;

(2)基于(1)中的存储结构,编写函数创建一个二叉树,实现二叉树结点信息的录入

真题给的答案第二问是错了,正确创建方式应该如下:

#include <iostream>
using namespace std;
BiTree* CreateTree()
{
	BiTree* myTree;
	int item;
	cin >> item;
	//0为叶子节点数据标志
	if (item==0)
	{
		//若某一节点为叶子结点,则其左右子树均为NULL,0表示建空树
		myTree = NULL;
	}
	else {
		//先序创建一棵二叉树
		myTree = new BiTree();
		myTree->data = item;
		myTree->lchild = CreateTree();
		myTree->rchild = CreateTree();

	}
		
	return myTree;

}

注:在本题中,采用的是先序创建,如果要中序创建,后序创建代码应该怎么写?

(3)编写函数实现二叉树中所有结点的左右子树互换

void Change(BiTree* T)
{
	BiTree *tmp;
	while (T!=NULL)
	{
		tmp = T->rchild;
		T->rchild = T->lchild;
		T->lchild = tmp;
		Change(T->lchild);
		Change(T->rchild);
	}
	
}

3.第三题

3.某序列采用链式存储结构进行存储,请编写程序采用直接插入排序算法实现该序列按从小到大的顺序排列。要求(共8分)

(1)定义链表的存储结构。(2分)

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

(2)编写函数采用直接插入排序算法将该序列按从小到大的顺序排列。(6分)

LNode* InsertSort(LNode* L) {

	if (L==NULL||L->next==NULL||L->next->next==NULL)
	{
		//如果链表为空或只有一个结点直接返回
		return L;
	}
	
	LNode *pcur, *pre, *prior, *pHead;
	pHead = L;
	//指向链表第一个元素
	pre = L->next;
	//指向链表第二个元素
	pcur =pre->next;
	
	while (pcur!=NULL)
	{
		if (pre->data < pcur->data)
		{
			pcur = pcur->next;
			pre = pre->next;
		}
		else 
		{
			//从表头开始找,
			prior = L;
			//找到第一个大于pcur的位置
			while ((prior->next != NULL) && (prior->next->data < pcur->data))
			{
				prior = prior->next;
			}
			//将pcur插入找到的位置上
			pre->next = pcur->next;
			pcur->next = prior->next;
			prior->next = pcur;
			pcur = pre->next;
		}
	}

	return pHead;
}

猜你喜欢

转载自blog.csdn.net/haimianjie2012/article/details/83005467
今日推荐