寻找数组中第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;
}