使用c语言写出 首先,从记事本中依次读取每一行通讯录内容,将读取的所有教师信息按照年龄构建成二叉排序树,如图8-2所示。然后,分别通过对二叉排序树的先序遍历显示所有教师信息,通过二叉排序树的后序遍历按照姓名查询某位教师通讯信息,通过二叉排序树后序遍历按照部门查询该部门所有教师的通讯信息;最后,通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息,遍历过程中,如果某个结点的年龄大于35岁,那么不再需要遍历该结点的右子树
时间: 2024-02-21 21:57:20 浏览: 72
以下是使用C语言实现上述要求的代码:
```c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Teacher {
char name[20]; // 姓名
int age; // 年龄
char gender[5]; // 性别
char department[20];// 部门
char phone[12]; // 电话号码
} Teacher;
typedef struct BSTNode {
Teacher data; // 数据
struct BSTNode *lchild, *rchild; // 左右子树
} BSTNode, *BSTree;
// 创建新节点
BSTNode* createNode(Teacher data) {
BSTNode *node = (BSTNode*)malloc(sizeof(BSTNode));
node->data = data;
node->lchild = node->rchild = NULL;
return node;
}
// 插入节点
void insertNode(BSTree *root, Teacher data) {
if (*root == NULL) {
*root = createNode(data);
return;
}
if (data.age < (*root)->data.age) {
insertNode(&(*root)->lchild, data);
} else {
insertNode(&(*root)->rchild, data);
}
}
// 先序遍历
void preOrder(BSTree root) {
if (root == NULL) {
return;
}
printf("%s\t%d\t%s\t%s\t%s\n", root->data.name, root->data.age, root->data.gender, root->data.department, root->data.phone);
preOrder(root->lchild);
preOrder(root->rchild);
}
// 后序遍历查询某位教师
void postOrderSearchByName(BSTree root, char *name) {
if (root == NULL) {
return;
}
postOrderSearchByName(root->lchild, name);
postOrderSearchByName(root->rchild, name);
if (strcmp(root->data.name, name) == 0) {
printf("%s\t%d\t%s\t%s\t%s\n", root->data.name, root->data.age, root->data.gender, root->data.department, root->data.phone);
}
}
// 后序遍历查询某个部门的所有教师
void postOrderSearchByDepartment(BSTree root, char *department) {
if (root == NULL) {
return;
}
postOrderSearchByDepartment(root->lchild, department);
postOrderSearchByDepartment(root->rchild, department);
if (strcmp(root->data.department, department) == 0) {
printf("%s\t%d\t%s\t%s\t%s\n", root->data.name, root->data.age, root->data.gender, root->data.department, root->data.phone);
}
}
// 中序遍历输出青年教师
void inOrder(BSTree root) {
if (root == NULL) {
return;
}
inOrder(root->lchild);
if (root->data.age <= 35) {
printf("%s\t%d\t%s\t%s\t%s\n", root->data.name, root->data.age, root->data.gender, root->data.department, root->data.phone);
}
inOrder(root->rchild);
}
int main() {
FILE *fp;
char buf[100];
Teacher teacher;
BSTree root = NULL;
// 从文件中读取教师信息并插入到二叉排序树中
fp = fopen("teacher.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return -1;
}
while (fgets(buf, sizeof(buf), fp)) {
sscanf(buf, "%s %d %s %s %s", teacher.name, &teacher.age, teacher.gender, teacher.department, teacher.phone);
insertNode(&root, teacher);
}
fclose(fp);
// 先序遍历显示所有教师信息
printf("先序遍历显示所有教师信息:\n");
preOrder(root);
printf("\n");
// 后序遍历查询某位教师
printf("请输入要查询的教师姓名:");
char name[20];
scanf("%s", name);
printf("后序遍历查询结果:\n");
postOrderSearchByName(root, name);
printf("\n");
// 后序遍历查询某个部门的所有教师信息
printf("请输入要查询的部门名称:");
char department[20];
scanf("%s", department);
printf("后序遍历查询结果:\n");
postOrderSearchByDepartment(root, department);
printf("\n");
// 中序遍历输出青年教师
printf("中序遍历输出青年教师:\n");
inOrder(root);
return 0;
}
```
其中, `teacher.txt` 文件中存储了教师的信息,每行信息包括姓名、年龄、性别、部门、电话号码,以空格分隔。
阅读全文