2020软件工程作业04

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/2018SE/
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/2018SE/homework/11406
这个作业的目标 实现两道算法
学号 20189609

算法1 区间k大数查询

1.1解题思路

写一个方法通过输入的数组根据起始和终点,获得新的数组进行排序,这里用的是冒泡排序,最后返回第k大的数值。

1.2解题代码

#include<stdio.h>
#include<stdlib.h>
void Sort(int* brr, int n)
{
	int i , j ,temp;
	for (i = 0; i < n - 1; i++){
		for (j = 0; j < n - 1 - i; j++){
			if (brr[j] < brr[j+1]){
			    temp = brr[j];
				brr[j] = brr[j+1];
				brr[j+1] = temp;
			}
		}
	}
}

int Find(int arr[], int l, int r, int k)
{
	int i = 0, j = 0;
	int* brr;
	brr = (int*)malloc(sizeof(int)*(r - l + 1));
	for (i = l-1; i <= r-1; i++){
		brr[j++] = arr[i];
	}
	Sort(brr, r - l + 1);
	return brr[k - 1];
	free(brr);
}

int main()
{
	int n, i;
	scanf("%d", &n);
	int* arr = NULL;
	arr = (int*)malloc(sizeof(int)*n);
	if (arr == NULL){
		printf("false\n");
		exit(1);
	}
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	int m;
	scanf("%d",&m);
	int* crr = NULL;
	crr = (int*)malloc(sizeof(int)*m);
	i = 0;
	int w = m;
	while (m--)
	{
		int l, r, k;
		scanf("%d%d%d", &l, &r, &k);
		crr[i++]=Find(arr,l,r,k);
	}
	for  (i = 0; i < w; i++)
	{
		printf("%d\n", crr[i]);
	}
	return 0;
}

算法1

算法2 二叉树的先、中、后 序遍历与层级遍历

2.1解题思路

在民政大二就开始学数据结构,看了好多学校的数据结构,我用的是C语言写的,先序中序后序通过递归调用,层序基本思想:按层次顺序遍历二叉树的原则是先被访问的结点的左、右儿子结点先被访问,因此,在遍历过程中需利用具有先进先出特性的队列结构。

2.2解题代码

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXSIZE 30
 
typedef struct bitree{
	char data;
	struct bitree *Lchild;
	struct bitree *Rchild;
}*Bitree,BiTree;  //二叉树 
 
typedef struct node{
	Bitree data;
	struct node *Next;
}NODE,*Node;   //队列数据域 
 
typedef struct{
	Node front;
	Node rear;
}QUEQUE,*QueQue; //队列指针域 
 
Bitree Create_Bitree();//创建二叉树 
void Create_Bitree_input(Bitree *root);//初始化二叉树
QueQue Create_QueQue();//创建队列
void INPUT_QUEQUE(QueQue A,Bitree root);//出队 
int Empty_QUEQUE(QueQue A);//队列判空 
void OUTPUT_QUEQUE(QueQue A,Bitree *root); //入队
void preorder(Bitree root);//先序递归遍历 
void PostOrder(Bitree root);//后序递归遍历
void Inorder(Bitree root);//中序递归遍历
void Levelorder(Bitree root);//层次遍历
 
main()
{
	Bitree root;
	root=Create_Bitree();
	Create_Bitree_input(&root); 
	preorder(root);//先序递归遍历 
	printf("\n"); 
	Inorder(root);//中序递归遍历
	printf("\n");
	PostOrder(root);//后序递归遍历
	printf("\n");
	Levelorder(root);//层次遍历
	printf("\n");
	//ATDNB##4#9##51####6##   测试样例 
} 
 
 
Bitree Create_Bitree()//创建二叉树 
{
	Bitree root=(Bitree)malloc(sizeof(BiTree));
	root->Lchild=root->Rchild=NULL;	
	return root;
}
 
void Create_Bitree_input(Bitree *root)//初始化二叉树 
{
	char ch;
	ch=getchar();
	if(ch=='#')  *root=NULL;
	else
	{
		(*root)=(Bitree)malloc(sizeof(BiTree));
		(*root)->data=ch;
		Create_Bitree_input(&((*root)->Lchild));
		Create_Bitree_input(&((*root)->Rchild));
	}
}
 
 
QueQue Create_QueQue()//创建队列
{
	QueQue A=(QueQue)malloc(sizeof(QUEQUE));
	Node   B=(Node)malloc(sizeof(NODE)); 
	B->Next=NULL;
	A->front=A->rear=B;
	return A;	
}
 
void INPUT_QUEQUE(QueQue A,Bitree root)//出队 
{
	Node B;
	B=(Node)malloc(sizeof(NODE));
	B->data=root;
	B->Next=NULL;
	A->rear->Next=B;
	A->rear=B;	
}
 
int Empty_QUEQUE(QueQue A)//队列判空 
{
	if(A->front==A->rear)
	return 1;
	else 
	return 0;	
}
 
void OUTPUT_QUEQUE(QueQue A,Bitree *root) //入队
{
	Node B;
	if(!Empty_QUEQUE(A))
	{ 
		B=A->front->Next;
		A->front->Next=B->Next;
		*root=B->data;
		if(A->front->Next==NULL)
		{
			A->rear = A->front; 
		}
		
	}
} 
 
void preorder(Bitree root)//递归先序遍历 
{
	if(root)	
	{
		printf("%c",root->data);
		preorder(root->Lchild);
		preorder(root->Rchild);
	}
}
 
void Inorder(Bitree root)//中序递归 
{
	
	if(root)	
	{
		Inorder(root->Lchild);
		printf("%c",root->data);
		Inorder(root->Rchild);
	}
}
 
 
void PostOrder(Bitree root)	//后序递归遍历
{
    if(root)
    {
        PostOrder(root->Lchild);
        PostOrder(root->Rchild);
        printf("%c", root->data);
    }
}
 
void Levelorder(Bitree root)//层次遍历 
{
	Bitree p;        
	QueQue A;	                 //定义队列			
	A=Create_QueQue();          //创建队列 
	INPUT_QUEQUE(A,root); 		//入队 
	while(!Empty_QUEQUE(A))     //队列非空时 
	{
		OUTPUT_QUEQUE(A,&p);   //出队 
		printf("%c",p->data);
		if(p->Lchild!=NULL) INPUT_QUEQUE(A,p->Lchild);//左孩子入队 
 		if(p->Rchild!=NULL) INPUT_QUEQUE(A,p->Rchild);//右孩子入队 
	}
}

2

posted @ 2020-10-24 13:42  Shoo1er  阅读(136)  评论(1编辑  收藏  举报