深入理解C指针 6.4.4 用指针支持树
- 读到这一节的时候,总感觉有问题。上机实验了一下,发现只要调整一下
insertNode
的先后顺序,则输出结果便于预期不一致了。以下为实验过程即改进方案。
书中原版示例
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _employee
{
char name[32];
unsigned char age;
} Employee;
int compareEmployee(Employee *e1, Employee *e2)
{
return strcmp(e1->name, e2->name);
}
void displayEmployee(Employee *employee)
{
printf("%s\t%d\n", employee->name,employee->age);
}
typedef struct _tree
{
void *data;
struct _tree *left;
struct _tree *right;
} TreeNode;
typedef void(*DISPLAY)(void*);
typedef int(*COMPARE)(void *, void *);
void insertNode(TreeNode **root, COMPARE compare, void *data)
{
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right= NULL;
if(*root == NULL) {
*root = node;
return;
}
while(1) {
if(compare((*root)->data, data) > 0) {
if((*root)->left != NULL) {
*root = (*root)->left;
} else {
(*root)->left = node;
break;
}
} else {
if((*root)->right != NULL) {
*root = (*root)->right;
} else {
(*root)->right = node;
break;
}
}
}
}
void preOrder(TreeNode *root, DISPLAY display)
{
if(root != NULL) {
display(root->data);
preOrder(root->left, display);
preOrder(root->right, display);
}
}
int main(int argc, char * argv)
{
Employee *samuel = (Employee*)malloc(sizeof(Employee));
Employee *sally = (Employee*)malloc(sizeof(Employee));
Employee *susan = (Employee*)malloc(sizeof(Employee));
strcpy(samuel->name,"Samuel");
strcpy(sally->name,"Sally");
strcpy(susan->name,"Susan");
samuel->age = 32;
sally->age = 28;
susan->age = 45;
TreeNode *tree = NULL;
insertNode(&tree, (COMPARE)compareEmployee, susan);
insertNode(&tree, (COMPARE)compareEmployee, samuel);
insertNode(&tree, (COMPARE)compareEmployee, sally);
preOrder(tree, (DISPLAY)displayEmployee);
free(samuel);
free(sally);
free(susan);
return 0;
}
运行结果
- 插入三个值, 但是遍历二叉树时却只有两个值了
修复后的代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _employee
{
char name[32];
unsigned char age;
} Employee;
int compareEmployee(Employee *e1, Employee *e2)
{
return strcmp(e1->name, e2->name);
}
void displayEmployee(Employee *employee)
{
printf("%s\t%d\n", employee->name,employee->age);
}
typedef struct _tree
{
void *data;
struct _tree *left;
struct _tree *right;
} TreeNode;
typedef void(*DISPLAY)(void*);
typedef int(*COMPARE)(void *, void *);
void insertNode(TreeNode **root, COMPARE compare, void *data)
{
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right= NULL;
if(*root == NULL) {
*root = node;
return;
}
TreeNode *cur = *root;
while(1) {
if(compare(cur->data, data) > 0) {
if(cur->left != NULL) {
cur = cur->left;
} else {
cur->left = node;
break;
}
} else {
if(cur->right != NULL) {
cur = cur->right;
} else {
cur->right = node;
break;
}
}
}
}
void preOrder(TreeNode *root, DISPLAY display)
{
if(root != NULL) {
display(root->data);
preOrder(root->left, display);
preOrder(root->right, display);
}
}
int main(int argc, char * argv)
{
Employee *samuel = (Employee*)malloc(sizeof(Employee));
Employee *sally = (Employee*)malloc(sizeof(Employee));
Employee *susan = (Employee*)malloc(sizeof(Employee));
strcpy(samuel->name,"Samuel");
strcpy(sally->name,"Sally");
strcpy(susan->name,"Susan");
samuel->age = 32;
sally->age = 28;
susan->age = 45;
TreeNode *tree = NULL;
insertNode(&tree, (COMPARE)compareEmployee, susan);
insertNode(&tree, (COMPARE)compareEmployee, samuel);
insertNode(&tree, (COMPARE)compareEmployee, sally);
preOrder(tree, (DISPLAY)displayEmployee);
free(samuel);
free(sally);
free(susan);
return 0;
}
运行结果
- 使用修复后的代码,进行验证 则插入值正常显示。符合预期