04734数据结构实践考试复习

  1. 考试情况

实践考试考试学校很重要,我是在北大考,北大历年考题都这样的:
在这里插入图片描述至于真实情况,我考完试再来补充分享。
咳咳,考完了特地前来补充,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、排序
实现直接插入、冒泡、直接选择、快速、堆、归并排序、并鼓励实现基数排序。比较各种排序算法的运行速度。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值