我想要一个动态查找表的C语言程序,利用二叉排序树完成动态查找表的建立、指定关键字的查找、如果查找失败进行插入,查找成功进行删除。 要输入一组数据,输出显示二叉排序树的中序遍历结果、查找成功与 否的信息、插入和删除后的中序遍历结果。 算法要点:二叉排序树建立方法、动态查找方法,对树进行中序遍历。
时间: 2023-12-24 11:02:08 浏览: 24
以下是一个利用二叉排序树实现动态查找表的 C 语言程序示例,实现了建立、查找、插入和删除操作,并输出中序遍历结果:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char key[20];
char value[20];
struct Node *left;
struct Node *right;
} Node;
Node *create_node(char *key, char *value) {
Node *new_node = (Node *) malloc(sizeof(Node));
strcpy(new_node->key, key);
strcpy(new_node->value, value);
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}
void insert(Node **root, char *key, char *value) {
if (*root == NULL) {
*root = create_node(key, value);
} else if (strcmp(key, (*root)->key) < 0) {
insert(&((*root)->left), key, value);
} else if (strcmp(key, (*root)->key) > 0) {
insert(&((*root)->right), key, value);
} else {
printf("Key already exists: %s\n", key);
}
}
Node *search(Node *root, char *key) {
if (root == NULL) {
return NULL;
}
if (strcmp(key, root->key) == 0) {
return root;
} else if (strcmp(key, root->key) < 0) {
return search(root->left, key);
} else {
return search(root->right, key);
}
}
void delete(Node **root, char *key) {
if (*root == NULL) {
return;
}
if (strcmp(key, (*root)->key) < 0) {
delete(&((*root)->left), key);
} else if (strcmp(key, (*root)->key) > 0) {
delete(&((*root)->right), key);
} else {
Node *cur = *root;
if (cur->left == NULL) {
*root = cur->right;
free(cur);
} else if (cur->right == NULL) {
*root = cur->left;
free(cur);
} else {
Node *min = cur->right;
while (min->left != NULL) {
min = min->left;
}
strcpy(cur->key, min->key);
strcpy(cur->value, min->value);
delete(&cur->right, min->key);
}
}
}
void inorder_traversal(Node *root) {
if (root != NULL) {
inorder_traversal(root->left);
printf("%s: %s\n", root->key, root->value);
inorder_traversal(root->right);
}
}
int main() {
Node *root = NULL;
insert(&root, "apple", "a kind of fruit");
insert(&root, "banana", "a kind of fruit");
insert(&root, "carrot", "a kind of vegetable");
printf("Inorder traversal before deletion:\n");
inorder_traversal(root);
Node *result = search(root, "banana");
if (result != NULL) {
printf("Search result: %s: %s\n", result->key, result->value);
} else {
printf("Search failed: banana\n");
}
result = search(root, "pear");
if (result != NULL) {
printf("Search result: %s: %s\n", result->key, result->value);
} else {
printf("Search failed: pear\n");
insert(&root, "pear", "a kind of fruit");
}
delete(&root, "banana");
printf("Inorder traversal after deletion:\n");
inorder_traversal(root);
return 0;
}
```
该程序使用二叉排序树实现动态查找表,可以插入、删除和查找键值对。注意到 `Node` 结构体中的 `key` 和 `value` 数组是固定长度的,如果需要处理不定长字符串,可以使用动态内存分配。程序还实现了中序遍历函数 `inorder_traversal`,用于输出二叉排序树的中序遍历结果。