第四次作业

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

寻找数组中第K大数

#include<stdio.h>
#include<stdlib.h>


struct Arr
{
	int* pBase;//存储的是数组第一个元素地址
	int len;//数组所能容纳最大元素个数
	int cnt;//当前数组的有效个数
};

void init_arr(struct Arr* pArr, int len);//数组初始化
bool is_empty(struct Arr* pArr);//判断数组是否溢出
bool is_full(struct Arr* pArr);//判断数组是否为空
bool append_arr(struct Arr* pArr, int val);//输入数组值
void show_arr(struct Arr* pArr);//输出数组值
void sort_arr(struct Arr* );//排序
void find_k(struct Arr* pArr, int l, int r, int k_num);//寻找数组内第K大的数
int main() {
	int num;//数组长度
	int K_num;//需要查找的是第K大的数
	int l, r;//查找的[l, r]区间的值

	struct Arr arr;
	printf("请输入数组长度:");
	scanf_s("%d",&num);

	init_arr(&arr,num);
	append_arr(&arr, num);
	show_arr(&arr);
	sort_arr(&arr);

	printf("需要查找的是[l,r]区间中从第K大的数:");
	scanf_s("%d %d %d" , &l, &r, &K_num);

	find_k(&arr, 1, r, K_num);

	

}

void init_arr(struct Arr *pArr, int len)
{
	pArr->pBase = (int*)malloc(sizeof(int)*len);
	if (NULL == pArr->pBase)
	{
		printf("动态分配内存失败!\n");
		exit(-1);
	}
	else
	{
		pArr->len = len;
		pArr->cnt = 0;
	}

	return;
}

bool is_empty(struct Arr* pArr) {
	if (0 == pArr->cnt) {
		return true;
	}
	else {
		return false;
	}
}

bool is_full(struct Arr* pArr) {
	if(pArr->cnt == pArr->len){
		return true;
	}
	else
	{
		return false;
	}
}

void show_arr(struct Arr * pArr) {
	if (is_empty(pArr))
	{
		printf("数组为空!\n");
	}
	else
	{
		printf("数组为:");
		for (int i = 0; i < pArr->cnt; ++i) {
			printf("%d", pArr->pBase[i]);//pArr->pBase[i] 相当 int *
			printf(" ");
		}
	}

	printf("\n");

	return;
}

bool append_arr(struct Arr* pArr, int num) {
	int val;
	int i;

	//满返回false
	if (is_full(pArr))
	{
		return false;
	}

	//不满时写入值
	printf("请输入数组各个值:\n");
	for (i = 0; i < num; i++)
	{
		scanf_s("%d", &val);
		pArr->pBase[pArr->cnt] = val;
		pArr->cnt++;
	}

	return true;
}

void sort_arr(struct Arr* pArr) {
	int i, j, t;

	printf("从大到小排序:");
	for (i = 0; i < pArr->cnt; i++) {
		for (j = i + 1; j < pArr->cnt; j++) {
			if (pArr->pBase[j] > pArr->pBase[i])
			{
				t = pArr->pBase[i];
				pArr->pBase[i] = pArr->pBase[j];
				pArr->pBase[j] = t;
			}
		}
		printf("%d", pArr->pBase[i]);//pArr->pBase[i] 相当 int *
		printf(" ");
		
	}
	printf("\n");

	return;
}

void find_k(struct Arr *pArr,int l, int r, int k_num ) {
	int i, j, t;

	if (r > pArr->cnt || pArr->cnt == NULL || r <= l)
		exit(-1);

	
		for (i = 0; i < pArr->cnt; i++) {
			for (j = i; j < pArr->cnt; j++) {
				if (pArr->pBase[j] > pArr->pBase[i]) {
					t = pArr->pBase[i];
					pArr->pBase[i] = pArr->pBase[j];
					pArr->pBase[j] = t;
				}
			}
			printf("%d", pArr->pBase[i]);//pArr->pBase[i] 相当 int *
			printf(" ");
		}
	
		
		
}

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

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/**二叉树数据结构定义**/
typedef struct BiTreeNode
{
    char data;
    struct BiTreeNode* left;
    struct BiTreeNode* right;
}BiTreeNode, * BiTree;

/**二叉树的建立--按照先序方式建立--插入**/
void CreateBiTree(BiTree* T)
{
    char val;
    scanf_s("%c", &val);

    if (val == '#')
        *T = NULL;  //null表示为空枝

    else
    {
        *T = (BiTree)malloc(sizeof(BiTreeNode));
        (*T)->data = val;
        CreateBiTree(&(*T)->left);
        CreateBiTree(&(*T)->right);
    }
}


/**先序遍历 :先序遍历(Pre-order),按照根左右的顺序沿一定路径经过路径上所有的结点。
在二叉树中,先根后左再右。巧记:根左右。**/
void PreOrderTravel(BiTree T)
{
    if (T == NULL)
        return;
    printf("%c ", T->data);
    PreOrderTravel(T->left);
    PreOrderTravel(T->right);
}

/**中序遍历 :中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。巧记:左根右**/
void InOrderTravel(BiTree T)
{
    if (T == NULL)
        return;
    InOrderTravel(T->left);
    printf("%c ", T->data);
    InOrderTravel(T->right);
}

/**后序遍历 :后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历、后序周游,可记做左右根。
后序遍历有递归算法和非递归算法两种。
在二叉树中,先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点。**/
void TailOrderTravel(BiTree T)
{
    if (T == NULL)
        return;
    TailOrderTravel(T->left);
    TailOrderTravel(T->right);
    printf("%c ", T->data);
}
int main()
{

    printf("测试代码\n");
    BiTree T;
    T = (BiTree)malloc(sizeof(BiTreeNode));

    printf("请给二叉树按照先序方式依次输入结点的值(空结点为#):\n");
    CreateBiTree(&T);

    printf("先序方式遍历结果:\n");
    PreOrderTravel(T);
    printf("\n");

    printf("中序方式遍历结果:\n");
    InOrderTravel(T);
    printf("\n");

    printf("后序方式遍历结果:\n");
    TailOrderTravel(T);
    printf("\n");
    return 0;
}

posted @ 2020-10-29 16:35  TheWhiteFox  阅读(75)  评论(0)    收藏  举报