如何以兄弟孩子表示法写一份学生会组织人员管理系统

时间: 2023-08-07 16:07:44 浏览: 63
以下是使用兄弟孩子表示法(又称为双亲表示法)来写一份学生会组织人员管理系统的示例: ```c #define MAX_TREE_SIZE 100 // 树的最大结点数 // 学生会组织人员结构体 typedef struct { int id; // 学号 char name[20]; // 姓名 char position[20]; // 职位 } Student; // 树的结点结构体 typedef struct { Student data; // 数据域,存储学生会组织人员信息 int parent; // 双亲域,存储双亲结点在数组中的下标 int firstChild; // 长子域,存储长子结点在数组中的下标 int nextSibling; // 右兄弟域,存储右兄弟结点在数组中的下标 } TreeNode; // 树结构体 typedef struct { TreeNode nodes[MAX_TREE_SIZE]; // 结点数组 int root; // 根结点的下标 int size; // 树的结点数 } Tree; // 初始化树 void initTree(Tree *tree) { tree->root = -1; tree->size = 0; } // 在树中插入一个结点 void insertNode(Tree *tree, Student data, int parentIndex) { // 创建一个新结点 int newNodeIndex = tree->size; tree->nodes[newNodeIndex].data = data; tree->nodes[newNodeIndex].parent = parentIndex; tree->nodes[newNodeIndex].firstChild = -1; tree->nodes[newNodeIndex].nextSibling = -1; // 将新结点插入到树中 if (parentIndex == -1) { // 如果父结点下标为-1,则说明新结点为根结点 tree->root = newNodeIndex; } else { // 否则,将新结点作为父结点的长子或右兄弟 TreeNode *parentNode = &tree->nodes[parentIndex]; if (parentNode->firstChild == -1) { // 如果父结点没有长子,则将新结点作为父结点的长子 parentNode->firstChild = newNodeIndex; } else { // 否则,找到父结点的最后一个子结点,将新结点作为它的右兄弟 TreeNode *lastChildNode = &tree->nodes[parentNode->firstChild]; while (lastChildNode->nextSibling != -1) { lastChildNode = &tree->nodes[lastChildNode->nextSibling]; } lastChildNode->nextSibling = newNodeIndex; } } // 更新树的结点数 tree->size++; } // 根据学号查找结点在数组中的下标 int findNodeIndexById(Tree *tree, int id) { for (int i = 0; i < tree->size; i++) { if (tree->nodes[i].data.id == id) { return i; } } return -1; } // 根据姓名查找结点在数组中的下标 int findNodeIndexByName(Tree *tree, char *name) { for (int i = 0; i < tree->size; i++) { if (strcmp(tree->nodes[i].data.name, name) == 0) { return i; } } return -1; } // 根据职位查找结点在数组中的下标 int findNodeIndexByPosition(Tree *tree, char *position) { for (int i = 0; i < tree->size; i++) { if (strcmp(tree->nodes[i].data.position, position) == 0) { return i; } } return -1; } // 修改结点的信息 void modifyNode(Tree *tree, int index, Student data) { tree->nodes[index].data = data; } // 删除结点 void deleteNode(Tree *tree, int index) { TreeNode *node = &tree->nodes[index]; // 将该结点的长子及其所有子孙结点的双亲域设为该结点的双亲结点 if (node->firstChild != -1) { TreeNode *firstChildNode = &tree->nodes[node->firstChild]; firstChildNode->parent = node->parent; int nextSiblingIndex = firstChildNode->nextSibling; while (nextSiblingIndex != -1) { TreeNode *nextSiblingNode = &tree->nodes[nextSiblingIndex]; nextSiblingNode->parent = node->parent; nextSiblingIndex = nextSiblingNode->nextSibling; } } // 将该结点从双亲结点的子结点链表中删除 if (node->parent == -1) { tree->root = -1; } else { TreeNode *parentNode = &tree->nodes[node->parent]; if (parentNode->firstChild == index) { parentNode->firstChild = node->nextSibling; } else { TreeNode *prevSiblingNode = &tree->nodes[parentNode->firstChild]; while (prevSiblingNode->nextSibling != index) { prevSiblingNode = &tree->nodes[prevSiblingNode->nextSibling]; } prevSiblingNode->nextSibling = node->nextSibling; } } // 将该结点的双亲、长子和右兄弟域设为-1 node->parent = -1; node->firstChild = -1; node->nextSibling = -1; // 更新树的结点数 tree->size--; } ``` 以上代码使用了兄弟孩子表示法来实现学生会组织人员管理系统。可以通过 `insertNode` 函数向树中插入一个结点,通过 `findNodeIndexById`、`findNodeIndexByName` 和 `findNodeIndexByPosition` 函数查找结点在数组中的下标,通过 `modifyNode` 函数修改结点的信息,通过 `deleteNode` 函数删除结点。

相关推荐

最新推荐

recommend-type

学生会组织机构管理系统的设计与实现

本课程设计开发了一个学生会组织机构管理系统,学生会成员的信息包括姓名、性别、班级,学生会的组织机构用孩子兄弟表示法进行存储。为该存储结构设计一个模板类,设计成员函数完成插入、删除、查询、修改、输出等...
recommend-type

数据结构课程设计报告----景区旅游信息管理系统.doc

(1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入口景点,建立一个导游线路图,导游线路图用有向图表示。遍历采用深度优先策略,这也比较符合游客心理。 (2)为了使导游线路图...
recommend-type

电池管理系统的SOP估算(基于查表方式)

1、SOP,即State of Power,表示的是电池的功率状态,目前电芯供应商在给出电芯参数时,会给出5s,10s,30s,60s的持续功率;以60s的持续功率为例作为解释:电芯在60s内以不大于表格中给出的功率持续放电可以保证...
recommend-type

Java swing + socket + mysql 五子棋网络对战游戏FiveChess.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

纯C语言实现的控制台有禁手五子棋(带AI)Five-to-five-Renju.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。