1> 二叉树的创建、遍历自己实现一遍
代码:
bitree.h:
#ifndef BITREE_H
#define BITREE_H
#include<myhead.h>
typedef char datatype; //定义数据类型
//定义结点类型
typedef struct Node
{
datatype data; //数据域
struct Node * left_child; //左孩子指针
struct Node * right_child; //右孩子指针
}Node, *BiTreePtr;
//创建二叉树
BiTreePtr tree_create();
//先序遍历
void prio_order(BiTreePtr B);
//中序遍历
void in_order(BiTreePtr B);
//后序遍历
void post_order(BiTreePtr B);
#endif
bitree.c:
#include"bitree.h"
//创建二叉树
BiTreePtr tree_create()
{
char data = 0;
scanf(" %c", &data); //数据元素值
if(data == '#')
{
return NULL;
}
//如果不是NULL,需要申请结点
BiTreePtr p = (BiTreePtr)malloc(sizeof(Node));
if(NULL==p)
{
printf("结点申请失败\n");
return NULL;
}
//将数据元素放入数据域中
p->data = data;
//递归创建左子树
p->left_child = tree_create();
//递归创建右子树
p->right_child = tree_create();
return p; //将创建好的二叉树返回
}
//先序遍历
void prio_order(BiTreePtr B)
{
//判断逻辑
if(NULL == B)
{
return; //递归出口
}
//输出数据域
printf("%c\t", B->data);
//先序遍历左子树
prio_order(B->left_child);
//先序遍历右子树
prio_order(B->right_child);
}
//中序遍历
void in_order(BiTreePtr B)
{
//判断逻辑
if(NULL == B)
{
return; //递归出口
}
//中序遍历左子树
in_order(B->left_child);
//输出数据域
printf("%c\t", B->data);
//中序遍历右子树
in_order(B->right_child);
}
//后序遍历
void post_order(BiTreePtr B)
{
//判断逻辑
if(NULL == B)
{
return; //递归出口
}
//后序遍历左子树
post_order(B->left_child);
//后序遍历右子树
post_order(B->right_child);
//输出数据域
printf("%c\t", B->data);
}
main.c
#include"bitree.h"
int main(int argc, const char *argv[])
{
//调用创建函数
BiTreePtr B = tree_create();
if(NULL == B)
{
printf("创建失败\n");
return -1;
}
printf("创建成功\n");
printf("先序遍历结果为:");
prio_order(B);
printf("\n");
printf("中序遍历结果为:");
in_order(B);
printf("\n");
printf("后序遍历结果为:");
post_order(B);
printf("\n");
return 0;
}
运行结果:
2> 把所有的排序算法自己实现一遍
冒泡排序
代码:
#include<myhead.h>
void bubble_sort(int *arr, int n)
{
for(int i=1;i<n;i++)
{
int flag = 0;
for(int j=0;j<n-i;j++)
{
if(arr[j]<arr[j+1])
{
flag = 1;
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
if(flag == 0)
{
break;
}
}
}
void output(int *arr, int n)
{
printf("数组元素如下:");
for(int i=0;i<n;i++)
{
printf("%d\t",arr[i]);
}
putchar(10);
}
int main(int argc, const char *argv[])
{
int arr[8] = {2,5,1,8,3,7,6,4};
bubble_sort(arr,8);
output(arr,8);
return 0;
}
运行结果:
选择排序
代码:
#include<myhead.h>
void select_sort(int *arr, int n)
{
int mini = 0;
for(int i=0;i<n;i++)
{
int mini = i;
for(int j=i+1;j<n;j++)
{
if(arr[mini]>arr[j])
{
mini = j;
}
}
if(mini != i)
{
int temp = arr[mini];
arr[mini] = arr[i];
arr[i] = temp;
}
}
}
void output(int *arr, int n)
{
printf("数组元素如下:");
for(int i=0;i<n;i++)
{
printf("%d\t",arr[i]);
}
putchar(10);
}
int main(int argc, const char *argv[])
{
int arr[8] = {2,5,1,8,3,7,6,4};
select_sort(arr,8);
output(arr,8);
return 0;
}
运行结果:
直接插入排序
代码:
#include<myhead.h>
//定义插入排序函数
void insert_sort(int *arr, int n)
{
int i,j;
for(i=1; i<n; i++) //不断从待排序序列中选元素
{
int temp = arr[i]; //将待排序序列的第一个备份
for(j=i-1; temp<=arr[j]&&j>=0; j--)
{
//将元素后移
arr[j+1] = arr[j];
}
arr[j+1] = temp; //将元素放入对应位置
}
printf("排序成功\n");
}
int main(int argc, const char *argv[])
{
int arr[8] = {9,3,52,5,36,54,2,34};
insert_sort(arr,8);
for(int i=0;i<8;i++)
{
printf("%d\t",arr[i]);
}
putchar(10);
return 0;
}
运行结果:
快速排序
代码:
#include<myhead.h>
//定义一趟快速排序函数
//返回值:基准最终的下标
//arr:数组起始地址
//low:要排序容器的最小下标
//high:要排序容器的最大下标
int part(int *arr, int low, int high)
{
//选中基准
int X = arr[low]; //把第一个元素当做基准
while(high > low) //让循环继续的条件
{
//判断high所在的元素是否都比基准大
while(arr[high] >= X && high>low) //为了不错位
{
high--;
}
arr[low] = arr[high]; //将小的值,向前放
//判断low所在的元素是否都比基准小
while(arr[low] <= X && high>low)
{
low++;
}
arr[high] = arr[low]; //将大的值,向后放
}
//基准的位置就选出来了 此时 high==low
arr[low] = X; //将基准放入指定位置
printf("排序一趟\n");
return low; //返回基准的下标
}
//定义快速排序函数
void quick_sort(int *arr, int low, int high)
{
if(low>=high)
{
return; //只有一个元素,无需排序。递归出口
}
//不只一个元素时
int mid = part(arr, low, high); //进行一趟排序
//对左半部分快排
quick_sort(arr, low, mid-1);
//对右半部分快排
quick_sort(arr, mid+1, high);
}
int main(int argc, const char *argv[])
{
int arr[8] = {9,3,52,5,36,54,2,34};
quick_sort(arr,0,7);
for(int i=0;i<8;i++)
{
printf("%d\t",arr[i]);
}
putchar(10);
return 0;
}
运行结果:
3> 把前面所有数据结构内容自行复习一遍
思维导图: