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.设某堆栈的存储结构定义如下,请按要求完成如下问题。(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)
{
--stack.top;
a[i] = *stack.top;
i++;
}
//对数组a中的元素进行排序
for (int i = 0; i < len; i++)
{
for (int j = i+1; j < len; j++)
{
//栈底到栈顶从小到大,所以a[0]最大
if (a[i]
2.某二叉树采用二叉链表的存储结构,请编写程序实现二叉树中所有节点的左右子树互换。要求:(12分)
(1)写出二叉树二叉链表的存储结构定义。(2分)
(2)基于(1)中的存储结构,编写函数创建一个二叉树,实现二叉树结点信息的录入。(4分)
(3)编写函数实现二叉树中所有结点的左右子树互换。(6分)
第一小问,比较基础,直接考的课本上面的定义:
typedef struct BiTree{
int data;
struct BiTree *lchild, *rchild;//左右孩子指针
}BiTree;
真题给的答案第二问是错了,正确创建方式应该如下:
#include
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;
}
注:在本题中,采用的是先序创建,如果要中序创建,后序创建代码应该怎么写?
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.某序列采用链式存储结构进行存储,请编写程序采用直接插入排序算法实现该序列按从小到大的顺序排列。要求(共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;
}
更多西南交通大学真题,参考:西南交通大学计算机考研——数据结构真题系列