C语言数据结构实验代码如下:
//二叉树基本操作的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Node {
Elemtype data;
struct Node* lchild, * rchild;
}Node, * Tree;
//初始化二叉树
Tree CreateTree(Tree T) {
Elemtype temp;
scanf("%d", &temp);
//判断当前节点是否还有孩子,默认0为标志
if (temp == 0) {
T = NULL;//当前分支节点无孩子
}
else {
T = (Node*)malloc(sizeof(Node));
//判断空间是否创建成功
if (!T) {
printf("结点空间创建失败\n");
return;
}
T->data = temp;
//递归调用创建
T->lchild = CreateTree(T->lchild);
T->rchild = CreateTree(T->rchild);
}
return T;
}
//先序遍历
void DLR(Tree T) {
//判断是否为空
if (T == NULL) {
return;
}
else {
printf("%d ", T->data);//根节点
DLR(T->lchild);//左孩子
DLR(T->rchild);//右孩子
}
}
//中序遍历
void LDR(Tree T) {
//判断是否为空
if (T == NULL) {
return;
}
else {
LDR(T->lchild);//左孩子
printf("%d ", T->data);//根节点
LDR(T->rchild);//右孩子
}
}
//后序遍历
void LRD(Tree T) {
//判断是否为空
if (T == NULL) {
return;
}
else {
LRD(T->lchild);//左孩子
LRD(T->rchild);//右孩子
printf("%d ", T->data);//根节点
}
}
//获取指定结点的左、右孩子
void GetChilds(Tree T, Elemtype e, int flag) {
if (T == NULL) {
return;
}
else {
if (T->data == e) {
printf("第%d个值为%d的结点的", flag, e);
if (T->lchild == NULL) {
printf("左孩子为空");
}
else {
printf("左孩子为 %d ", T->lchild->data);
}
if (T->rchild == NULL) {
printf("右孩子为空\n");
}
else {
printf("右孩子为 %d\n", T->rchild->data);
}
flag++;//更新计数器
}
GetChilds(T->lchild, e, flag);
GetChilds(T->rchild, e, flag);
}
}
//销毁二叉树
void DestroyTree(Tree T) {
if (T == NULL) {
return;
}
else {
DestroyTree(T->lchild);
DestroyTree(T->rchild);
free(T);
}
}
//菜单
void menu() {
Tree T = NULL;
printf("------------二叉树基本操作的实现------------\n");
printf("1.建立一个二叉树\n");
printf("2.退出菜单\n");
printf("请输入你所选择的操作数:");
int i = 0;
while (1) {
scanf("%d", &i);
switch (i) {
case 1:
T = CreateTree(T);
break;
case 2:
printf("--------------------------------------------");
return;
default:
printf("\n输入的操作数有误,请重新输入:");
}
if (i == 1) {
break;
}
}
while (1) {
printf("\n");
printf("1.先序遍历二叉树\n");
printf("2.中序遍历二叉树\n");
printf("3.后序遍历二叉树\n");
printf("4.获取指定结点的左、右孩子\n");
printf("5.销毁二叉树\n");
printf("请输入你所选择的操作数:");
scanf("%d", &i);
switch (i) {
case 1:
printf("先序遍历二叉树为:");
DLR(T);
printf("\n");
break;
case 2:
printf("中序遍历二叉树为:");
LDR(T);
printf("\n");
break;
case 3:
printf("后序遍历二叉树为:");
LRD(T);
printf("\n");
break;
case 4: {
Elemtype e;
int flag = 1;//定义一个记录结点个数的计数器
printf("请输入该节点的元素值:");
scanf("%d", &e);
GetChilds(T, e, flag);
break;
}
case 5:
DestroyTree(T);
printf("二叉树已销毁\n");
printf("--------------------------------------------");
return;
break;
default:
printf("\n输入的操作数有误,请重新输入:");
}
}
}
//菜单运行
void main() {
menu();
}
ps.陕理工22级数据结构第三次实验记录