C语言二叉树之通讯录查询系统设计从记事本中依次读取每一行通讯录内容,将读取的所有教师信息按照年龄构建成二叉排序树,然后,分别通过对二叉排序树的先序遍历显示所有教师信息,通过二叉排序树的后序遍历按照姓名查询某位教师通讯信息,通过二叉排序树后序遍历按照部门查询该部门所有教师的通讯信息;最后,通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息,遍历过程中,如果某个结点的年龄大于35岁,那么不再需要遍历该结点的右子树。的源代码
时间: 2023-11-13 09:02:24 浏览: 140
以下是C语言实现的二叉树通讯录查询系统代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct teacher {
char name[20];
int age;
char dept[20];
char phone[20];
} Teacher;
typedef struct node {
Teacher* data;
struct node* left;
struct node* right;
} Node;
Node* createNode(Teacher* data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void insert(Node** root, Teacher* data) {
if (*root == NULL) {
*root = createNode(data);
return;
}
if (data->age < (*root)->data->age) {
insert(&((*root)->left), data);
} else {
insert(&((*root)->right), data);
}
}
void preOrder(Node* root) {
if (root == NULL) {
return;
}
printf("%s %d %s %s\n", root->data->name, root->data->age, root->data->dept, root->data->phone);
preOrder(root->left);
preOrder(root->right);
}
void postOrderSearch(Node* root, char* name) {
if (root == NULL) {
return;
}
postOrderSearch(root->left, name);
postOrderSearch(root->right, name);
if (strcmp(root->data->name, name) == 0) {
printf("%s %d %s %s\n", root->data->name, root->data->age, root->data->dept, root->data->phone);
}
}
void postOrderDept(Node* root, char* dept) {
if (root == NULL) {
return;
}
postOrderDept(root->left, dept);
postOrderDept(root->right, dept);
if (strcmp(root->data->dept, dept) == 0) {
printf("%s %d %s %s\n", root->data->name, root->data->age, root->data->dept, root->data->phone);
}
}
void inOrder(Node* root) {
if (root == NULL) {
return;
}
inOrder(root->left);
if (root->data->age <= 35) {
printf("%s %d %s %s\n", root->data->name, root->data->age, root->data->dept, root->data->phone);
inOrder(root->right);
}
}
int main() {
FILE* fp = fopen("contacts.txt", "r");
if (fp == NULL) {
printf("Failed to open file\n");
return -1;
}
Node* root = NULL;
Teacher* teacher = (Teacher*)malloc(sizeof(Teacher));
while (fscanf(fp, "%s %d %s %s", teacher->name, &(teacher->age), teacher->dept, teacher->phone) != EOF) {
insert(&root, teacher);
teacher = (Teacher*)malloc(sizeof(Teacher));
}
free(teacher);
fclose(fp);
printf("========== All Teachers ==========\n");
preOrder(root);
printf("========== Search by Name ==========\n");
char name[20];
printf("Enter name: ");
scanf("%s", name);
postOrderSearch(root, name);
printf("========== Search by Department ==========\n");
char dept[20];
printf("Enter department: ");
scanf("%s", dept);
postOrderDept(root, dept);
printf("========== Young Teachers ==========\n");
inOrder(root);
return 0;
}
```
在这个程序中,我们定义了一个 `Teacher` 结构体,包含了教师的姓名、年龄、部门和电话信息。我们还定义了一个 `Node` 结构体,表示二叉树的节点,其中包含了一个 `Teacher` 类型的数据和左右子节点指针。我们使用 `createNode` 函数创建新的节点,使用 `insert` 函数向二叉树中插入节点,使用 `preOrder` 函数进行先序遍历输出所有教师信息,使用 `postOrderSearch` 函数按照姓名查询某位教师的通讯信息,使用 `postOrderDept` 函数按照部门查询该部门所有教师的通讯信息,使用 `inOrder` 函数输出年龄小于等于 35 岁的教师信息。
在 `main` 函数中,我们首先打开 `contacts.txt` 文件,从中读取每一行通讯录内容,并将其按照年龄构建二叉排序树。然后,我们分别通过对二叉排序树的先序遍历显示所有教师信息,通过二叉排序树的后序遍历按照姓名查询某位教师通讯信息,通过二叉排序树后序遍历按照部门查询该部门所有教师的通讯信息,通过二叉排序树的中序遍历输出青年教师(≤35岁)通讯信息。最后,我们关闭文件并释放内存。
阅读全文