如何添加头结点,已有代码求修改
目前问题:层次遍历时只能输出最近一次插入的结点,
若删除第一个插入的结点会输出错误内容
二叉链表实现医院病房病床管理系统
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在C语言中,要实现一个医院病房病床管理系统的二叉链表,首先我们需要定义二叉链表节点结构体,并编写相应的操作函数,如插入、删除和层次遍历等。这里是一个简单的实现示例:
#include <stdio.h> #include <stdlib.h> // 定义二叉链表节点结构体 typedef struct Node { int bed_number; // 病床号 struct Node* left; // 左子节点 struct Node* right; // 右子节点 } Node; // 创建新节点 Node* create_node(int bed_number) { Node* new_node = (Node*)malloc(sizeof(Node)); if (new_node == NULL) { printf("Memory allocation failed.\n"); exit(1); } new_node->bed_number = bed_number; new_node->left = NULL; new_node->right = NULL; return new_node; } // 插入节点到二叉树 void insert(Node** root, int bed_number) { if (*root == NULL) { *root = create_node(bed_number); // 如果根为空,创建新的头结点 } else { Node* current = *root; while (current != NULL) { if (bed_number < current->bed_number) { if (current->left == NULL) { current->left = create_node(bed_number); break; } current = current->left; } else { if (current->right == NULL) { current->right = create_node(bed_number); break; } current = current->right; } } } } // 层次遍历打印病床号 void level_order_traversal(Node* root) { if (root == NULL) { return; } Queue* queue = create_queue(); // 假设有一个队列数据结构已经实现 enqueue(queue, root); while (!is_empty(queue)) { Node* current = dequeue(queue); printf("%d ", current->bed_number); if (current->left != NULL) { enqueue(queue, current->left); } if (current->right != NULL) { enqueue(queue, current->right); } } free_queue(queue); // 释放队列 } // 删除给定病床号的节点 Node* delete_node(Node** root, int bed_number) { if (*root == NULL) { return NULL; } if ((*root)->bed_number == bed_number) { // 如果要删除的是根节点 Node* temp = *root; *root = (*root)->left ? (*root)->left : (*root)->right; // 更新根节点指向左子节点或右子节点 free(temp); return *root; } else { Node* current = *root; while (current != NULL && current->bed_number != bed_number) { if (bed_number < current->bed_number) { current = current->left; } else { current = current->right; } } if (current == NULL) { // 节点不存在 return *root; } if (current->left == NULL) { // 只有右子节点 Node* temp = current; current = current->right; free(temp); } else if (current->right == NULL) { // 只有左子节点 Node* temp = current; current = current->left; free(temp); } else { // 有两个子节点 Node* min_right = find_min(current->right); // 找到右子树中的最小值 current->bed_number = min_right->bed_number; // 替换当前节点的值 current->right = delete_node(¤t->right, min_right->bed_number); // 删除找到的最小值节点 } return *root; } } // 查找右子树中的最小值节点 Node* find_min(Node* node) { while (node->left != NULL) { node = node->left; } return node; } int main() { Node* root = NULL; insert(&root, 5); insert(&root, 3); insert(&root, 7); insert(&root, 2); insert(&root, 8); printf("Level order traversal: "); level_order_traversal(root); printf("\n"); delete_node(&root, 3); // 删除病床号为3的节点 printf("After deleting bed number 3:\n"); printf("Level order traversal: "); level_order_traversal(root); printf("\n"); return 0; }
这段代码实现了二叉链表的插入、层次遍历和删除功能。注意,在
delete_node
函数中,我们处理了根节点、只有一个子节点以及有两个子节点的情况,这样可以正确地删除任意位置的节点并保持树的平衡。这个例子假设已经有了队列的数据结构实现(
Queue
,enqueue
,dequeue
, 和is_empty
函数)。如果你没有这些函数,你需要自己实现它们。同样,对于内存管理和错误检查,也请根据实际情况进行调整。解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
- ¥20 关于URL获取的参数,无法执行二选一查询
- ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
- ¥15 marlin编译错误,如何解决?
- ¥15 有偿四位数,节约算法和扫描算法
- ¥15 VUE项目怎么运行,系统打不开
- ¥50 pointpillars等目标检测算法怎么融合注意力机制
- ¥20 Vs code Mac系统 PHP Debug调试环境配置
- ¥60 大一项目课,微信小程序
- ¥15 求视频摘要youtube和ovp数据集