- 考试情况
实践考试考试学校很重要,我是在北大考,北大历年考题都这样的:
至于真实情况,我考完试再来补充分享。
咳咳,考完了特地前来补充,2018.11.02考的,教学楼很好找,机房不太好找.考试时间从八点半到十一点半.每个人按照自己的机号坐,机号安排外面板子上有.考试说明要好好看一下.至于考试题目,真的相当幸运的就是下面列出的一二题,我是奇数账号,偶数账号题目是五六题.不知道是什么评分标准,过了再来更新,需要注意的是他们的软件用起来也会报错,我先使用helloworld运行试了一下,常出现的运行状况也会出现,修改方法在Visual C++使用入门级教程文章的最后,解决办法都用!!超好用!!
2. 复习情况
当然了~在练习之前首先解决开发工具问题:
Visual C++使用入门级教程(包含工具下载链接):
https://blog.csdn.net/Grandaunt/article/details/83583834
一些考题可以参考教材源码,这是别人分享的教材链接
https://download.csdn.net/download/xinzailiulang/3904395
知识点参考:
1、前序、中序、后序,第115页。
2、孩子结点,第108页。
3、有向图,第143页。
4、邻接矩阵,第144页。
5、深度优先遍历序列,第148页。
6、冒泡排序,第173页。
考题答案,我的版本:
1.编一C程序,它能根据输入的字符(字母或*)序列来构造一棵二叉树,并能输出该二叉树后序和中序序列,并计算出该二叉树度数为2的节点个数。输入是该二叉树经扩充后的结点前序遍历序列,扩充方法是:对无左孩子的结点,增加一个标记为的做孩子结点:对无右孩子的结点,增加一个标记为的右孩子结点。例如,若要构造的二叉树为
时,输入为ABDCE
(注:程序的可执行文件名必须是e1.exe,存于你的账号或其debug目录下,否则无成绩)
#include<stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
# define n 100 //叶子数目
# define m 2*n-1 //叶子中结点总数
#include <string.h>
#define MAXNODE 100
//#include <windows.h>
int num=0;
typedef char datatype;
typedef struct node
{//结点
datatype data;
struct node *lchild,*rchild;
}BinTNode;
typedef BinTNode *BinTree;
//前序遍历
void Inorder1(BinTree T)
{
if(T){
char a = T->data;
printf("%c",T->data);
Inorder1(T->lchild);
Inorder1(T->rchild);
}
}
//中序遍历
void Inorder2(BinTree T)
{
if(T){
char a = T->data;
Inorder2(T->lchild);
printf("%c",T->data);
Inorder2(T->rchild);
}
}
//后序遍历
void Inorder3(BinTree T)
{
if(T){
char a = T->data;
Inorder3(T->lchild);
Inorder3(T->rchild);
printf("%c",T->data);
}
}
//构建二叉树
void CreateBinTree(BinTree *T)
{
char ch;
if((ch=getchar())=='*')
*T = NULL;
else{
*T =(BinTNode *)malloc(sizeof(BinTNode));//生成结点
(*T)->data = ch;
CreateBinTree(&(*T)->lchild);//构造左子树
CreateBinTree(&(*T)->rchild);//构造右子树
}
}
//二叉树度数为2的节点个数
void Degree2NUm(BinTree T){
if(T == NULL)
return;
else
{
if(T->lchild!=NULL&&T->rchild!=NULL){//如果当前层大于num就交换
num ++;
}
Degree2NUm(T->lchild);
Degree2NUm(T->rchild);
}
}
void main()
{
BinTree *T = new BinTree();
printf("请输入二叉树前序遍历:");
CreateBinTree(T);
printf("中序遍历");
Inorder2(*T);
printf("\n后序遍历");
Inorder3(*T);
printf("\n前序遍历");
Inorder1(*T);
Degree2NUm(*T);
printf("\n该二叉树度数为2的结点个数为%d",num);
}
答案:
2:编一C程序,它能对输入的一串整数(不多于1000个,以-9999为结束标记,-9999不参与排序),进行趟数尽量少的冒泡排序(从大到小排序),输出排序结果和所用的趟数。(输入时,两个相邻的整数用空格隔开)。
(注:程序的可执行文件名必须是e2.exe,存于你的账号或其debug目录下,否则无成绩)
#include<stdio.h>
#define END -9999
#define MAX_SIZE 1005
int array[MAX_SIZE], n;
void BubbleSort()
{
int i, j; int temp;
for (i = 0; i < n - 1; i++)
for (j = 0; j < n - 1 - i; j++)
if (array[j] > array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
void main(){
int x;
printf("这是冒泡排序\n");
printf("请输入一串整数:\n");
for (n = 0; scanf("%d", &x) && x != END; array[n++] = x) {}
BubbleSort();
for (x = 0; x < n; printf("%d%c", array[x], " \n"[x + 1 == n]), ++x) {}
}
3.编一C程序,它能根据读入的数据构造有向图G,并能输出G的邻接矩阵及G的DFS遍历序列(从v0开始)。图的输入形式为n i1 j1 i2j2 …imjm -1-1,他们都是整数,且100>n>0,其余的值(除去-1)都>=0且<n。其中,n是图G的顶点个数(G的顶点为V0、V1、…Vn-1);整数对ikik(k=1,2,…m)表示的是G的从顶点Vik到顶点Vjk的有向边:整数对-1,-1位输入结束标记,不表示有向边。
(注:程序的可执行文件名必须是e1.exe,存于你的账号或其debug目录下,否则无成绩)
答案:
4:编一C程序,它能对输入的一串整数(不多于1000个,以-9999为结束标记,-9999不参与排序),进行直接插入排序(从小到大排序),输出排序结果和所用的关键字比较次数。(输入时,两个相邻的整数用空格隔开)。
(注:程序的可执行文件名必须是e2.exe,存于你的账号或其debug目录下,否则无成绩)
答案:
#include<stdio.h>
#define END -9999
#define MAX_SIZE 1005
int array[MAX_SIZE], n;
int cnt;
void InsertSort() {
int i, j, k, tmp;
for (cnt = 0, i = 1; i < n; ++i) {
for (j = i - 1; j >= 0 && array[j] > array[i]; ++cnt, --j) {}
tmp = array[i];
for (k = i; k > j + 1; array[k] = array[k - 1], --k) {} array[j + 1] = tmp;
}
}
int main() {
int x; for (n = 0; scanf("%d", &x) && x != END; array[n++] = x) {}
InsertSort(); printf("%d\n", cnt);
for (x = 0; x < n; printf("%d%c", array[x], " \n"[x + 1 == n]), ++x) {}
return 0;
}
5.编一C程序,它能根据输入的二叉树前序和中序序列来构造该二叉树,并能输出该二叉树的后续序列和该二叉树树度为2的结点个数。(输入次序是:表示前序序列的字符串、表示中序序列的字符串)。
(注:程序的可执行文件名必须是e1.exe,存于你的账号或其debug目录下,否则无成绩)
答案:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
#define N 100
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,* BITree;
int num=0;
//先序遍历
void preOrder(BiTNode*root)
{
if (root==NULL)
{
return;
}
printf("%c ",root->data);
preOrder(root->lchild);
preOrder(root->rchild);
}
//中序遍历
void inOrder(BiTNode*root)
{
if (root==NULL)
{
return;
}
inOrder(root->lchild);
printf("%c ",root->data);
inOrder(root->rchild);
}
//后序遍历
void houOrder(BiTNode*root)
{
if (root==NULL)
{
return;
}
inOrder(root->lchild);
inOrder(root->rchild);
printf("%c ",root->data);
}
/************************************************************************/
/* 算法
1、通过先序遍历找到根结点A,再通过A在中序遍历的位置找出左子树,右子树
2、在A的左子树中,找左子树的根结点(在先序中找),转步骤1
3、在A的右子树中,找右子树的根结点(在先序中找),转步骤1 */
/************************************************************************/
//根据先序遍历和中序遍历创建二叉树
BiTNode* createBiTree(char *pre, char *in, int n)
{
int i = 0;
int n1 = 0,n2 = 0;
int m1 = 0,m2 = 0;
BiTNode*node = NULL;
char lpre[N],rpre[N];
char lin[N],rin[N];
if (n == 0)
{
return NULL;
}
node = (BiTNode*)malloc(sizeof(BiTNode));
if (node==NULL)
{
return NULL;
}
memset(node,0,sizeof(BiTNode));
//先序序列的第一个元素必为根结点
node->data = pre[0];
//根据根结点将中序序列分为左子树和右子数
for (i = 0;i<n;i++)
{
if ((i<=n1)&&(in[i]!=pre[0]))
{
lin[n1++] = in[i];
}
else if(in[i]!=pre[0])
{
rin[n2++] = in[i];
}
}
//根据树的先序序列的长度等于中序序列的长度
//且先序遍历是先左子树再后子树,无论先序还是中序 左子树和右子树的长度都是固定的
//主意 从i=1开始 因为先序遍历的第一个是根
for (i = 1;i < n;i++)
{
if (i< (n1+1))//n1代表了左子树的长度
{
lpre[m1++] = pre[i];
}
else
{
rpre[m2++] = pre[i];
}
}
node->lchild = createBiTree(lpre,lin,n1);
node->rchild = createBiTree(rpre,rin,n2);
return node;
}
//二叉树度数为2的节点个数
void Degree2NUm(BITree T){
if(T == NULL)
return;
else
{
if(T->lchild!=NULL&&T->rchild!=NULL){//如果当前层大于num就交换
num ++;
}
Degree2NUm(T->lchild);
Degree2NUm(T->rchild);
}
}
int main()
{
char preNode[N];
char inNode[N];
int n = 0;
char ch;
BiTNode* root=NULL;
printf("请输入先序序列\n");
while((ch = getchar())&&ch!='\n')
preNode[n++] = ch;
printf("请输入中序序列\n");
n = 0;
while((ch = getchar())&&ch!='\n')
inNode[n++] = ch;
root = createBiTree(preNode,inNode,n);
printf("先序序列\n");
preOrder(root);
printf("\n中序序列\n");
inOrder(root);
printf("\n后序序列\n");
houOrder(root);
system("pause");
Degree2NUm(root);
printf("\n该二叉树度数为2的结点个数为%d",num);
return 0;
}
6:编一C程序,它能读入一串(n个)整数(n<1000,以-9999为结束标记),并判断第n个整数(即-9999的前一个)在前(n-1)个整数中出现的次数,再输出该次数(输入时,两个相邻的整数用空格隔开)。
(注:程序的可执行文件名必须是e2.exe,存于你的账号或其debug目录下,否则无成绩)
#include<stdio.h>
#define END -9999
#define MAX_SIZE 1005
int array[MAX_SIZE],n;
void main(){
int x,num=0;
printf("请输入一串整数,以-9999结尾:\n");
for(n=0;scanf("%d",&x)&&x!=END;array[n++]=x){}
for(x=0;x<n;x++){
if(array[x]==array[n-1])
num++;
}
printf("%d出现的次数为%d",array[n-1],num);
}
7.编一C程序,它能根据输入的二叉树中序和后序序列来构造该二叉树,并能输出该二叉树的前续序列和该二叉树的深度(高度)及叶结点数。(输入次序是:表示中序序列的字符串、表示后序序列的字符串)。
(注:程序的可执行文件名必须是e1.exe,存于你的账号或其debug目录下,否则无成绩)
答案:
8:编一C程序,它能读入一串整数(n<1000,以-9999为结束标记),进行直接选择排序(从小到大排序),输出排序结果和所用的记录交换次数。(输入时,两个相邻的整数用空格隔开)。
(注:程序的可执行文件名必须是e2.exe,存于你的账号或其debug目录下,否则无成绩)
答案:
1、线性表的插入和删除
要求对有序顺序表进行插入和删除操作,设数据域为整数。
要求对有序单链表进行插入和删除操作,单链表的数据域是字符串,但不允许重复的串插入表中。删除操作是根据输入的字符串,先找到相应的结果后删除之。
2、栈和队列操作
对一些简单应用问题,如进制转换、字符串输入等,利用栈或队列来实现。
3、二叉树操作
要求采用二叉链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历及求所有叶子和结点个数的操作等。
4、图的遍历操作
可采用邻接矩阵或邻接表作为存储结构,完成有向图和无向图的DFS和BFS操作。
5、数据查找
实现顺序查找、折半查找及二叉排序查找算法,比较他们的查找速度。
6、排序
实现直接插入、冒泡、直接选择、快速、堆、归并排序、并鼓励实现基数排序。比较各种排序算法的运行速度。
1、线性表的插入和删除
要求对有序顺序表进行插入和删除操作,设数据域为整数。
要求对有序单链表进行插入和删除操作,单链表的数据域是字符串,但不允许重复的串插入表中。删除操作是根据输入的字符串,先找到相应的结果后删除之。
2、栈和队列操作
对一些简单应用问题,如进制转换、字符串输入等,利用栈或队列来实现。
3、二叉树操作
要求采用二叉链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历及求所有叶子和结点个数的操作等。
4、图的遍历操作
可采用邻接矩阵或邻接表作为存储结构,完成有向图和无向图的DFS和BFS操作。
5、数据查找
实现顺序查找、折半查找及二叉排序查找算法,比较他们的查找速度。
6、排序
实现直接插入、冒泡、直接选择、快速、堆、归并排序、并鼓励实现基数排序。比较各种排序算法的运行速度。