《学生会组织机构管理系统的设计与实现》
第 1页 共 23页
学生会组织机构管理系统的设计与实现
学生姓名:指导老师:
摘 要 本课程设计开发了一个学生会组织机构管理系统,学生会成员的信息包括姓名、
性别、班级,学生会的组织机构用孩子兄弟表示法进行存储。为该存储结构设计一个模
板类,设计成员函数完成插入、删除、查询、修改、输出等功能。 在课程设计中,系
统开发平台为 Windows XP,程序设计的设计语言采用 C++,程序开发平台采用 Microsoft
Visual C++,程序运行平台为 Windows 98/2000/XP。在程序设计中,采用了面向对象解
决问题的方法。程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可
以应用解决实际问题。
关键词:学生会;数据结构;树;C++
《学生会组织机构管理系统的设计与实现》
第 2页 共 23页
目录
1 引言...........................................................................................................................................................3
1.1 需求分析..................................................................................................................................... 3
1.2 系统设计要点............................................................................................................................3
2 算法的实现............................................................................................................................................ 4
2.1 详细的设计....................................................................................................................................4
2.2 测试运行.........................................................................................................................................6
3 结束语..................................................................................................................................................... 11
4 参考文献................................................................................................................................................12
5 附录.......................................................................................................................................................... 13
《学生会组织机构管理系统的设计与实现》
第 3页 共 23页
1 引言
经过本学期数据结构的学习,运用 VC++设计本系统。机构管理系统是非常通用的管
理信息系统,在很多领域都有用到。本系统主要是自行设计一个树状层次结构来完成相
关的功能,而这里涉及的树形结构是一类重要的非线性结构。树形结构是结点之间有分
支,并具有层次关系的结构。它非常类似于自然界中的树。树结构在客观世界中是大量
存在的,例如家谱、行政组织机构都可用树形象地表示。 树在计算机领域中有着广泛
的应用,例如在编译程序中,用树来表示源程序的语法结构;在数据库系统中,可用树
来组织信息;在分析算法的行为时,可用树来描述其执行过程。
1.1 需求分析
本系统的最终用户是学校,根据从学校方面取得的图表资料、文字资料以及其他细
节方面的信息,再根据日常生活中的经验,以及所做的其他询问和调查,得出用户对系
统的实际要求是通过最简单实用的方法对组织机构各部分的信息修改或者查阅,而孩子
兄弟链表表示法中,结点形式统一,结点间的联系比较简洁。同时,在这种存储结构上
容易实现树数据结构的大多数运算。比如,若要访问结点 X 的第 i 个孩子,只需先从 X
的孩子域指针找到它的第一个孩子,然后沿各孩子结点的兄弟域指针连续扫描 i-1 个结
点即可。值得注意的是,孩子兄弟链表的组织形式与二叉链表完全相同;但存储结点中
指针的含义不同。二叉链表中存储结点的左、右指针分别指向左、右孩子;而孩子兄弟
链表中存储结点的两个指针分别指向“长子”和“大弟”。例如,在图 4-17 中,结点 B 的孩
子指针指向它的“长子”D,兄弟指针指向它的兄弟 C。结点 H 的孩子域为 nil,因为它没
有孩子;兄弟域指针指向它的比它“小”的兄弟中最“大”的兄弟 I。因此,孩子兄弟链表
表示是树的一种简单实用的存储结构。
1.2 系统设计要点
(1) 为方便对学生会组织机构的各项操作,学生会的组织机构用孩子兄弟表示法进行
存储。为该存储结构设计一个模板类,设计成员函数完成上述功能。
(2) 为树的孩子兄弟表示法设计一个结点类,将结点的数据部分作为私有成员隐藏在
类的内部,并提供查找右兄弟、查找第一个孩子等操作。
(3) 简单起见,学生会成员的自然情况包括职位、姓名、性别、年级、班级,为其设
计一个学生类,将各自然情况作为私有成员隐藏在类的内部,并提供相应成员函数实现
对数据进行访问。
《学生会组织机构管理系统的设计与实现》
第 4页 共 23页
(4) 在主函数中提供操作菜单,先对该组织机构进行初始化,即根据实验数据建立一棵树,再根
据用户的输入完成相应功能并输出结果。
2 算法的实现
2.1 详细的设计
为树的孩子兄弟表示法建立结点类(Node),其类定义如下:
template
class Node
{
public:
Node(T* data) { _data = data; _firstChild = NULL; _brother = NULL;}//有参构造函数
~Node() {}
Node* getFirstChild() { return _firstChild; }
Node* getBrother() { return _brother; }
T* getData() { return _data; }
void setFirstChild(Node* node) { _firstChild = node; } //为结点的第一个孩子赋值
void setBrother(Node* node) { _brother = node; }
void setData(T* data) { _data = data; }
//无参析构函数
//访问结点第一个孩子
//访问结点的右兄弟
//取结点数据域的值
//为结点的右兄弟赋值
//为结点的数据域赋值
private:
T* _data;
Node* _firstChild;
Node* _brother;
};
在结点类中,提供了如下成员函数:
(1) 函数的声明:Node(T* data);
//结点的数据域
//结点的头孩子指针
//结点的右兄弟指针
完成的功能:初始化一个新结点
(2) 函数的声明:Node* getFirstChild();
完成的功能:返回指向结点的第一个孩子结点的指针
(3) 函数的声明:Node* getBrother();
完成的功能:返回指向结点的右兄弟结点的指针;
(4) 函数的声明:T* getData();
完成的功能:返回结点数据域的值
(5) 函数的声明:void setFirstChild(Node* node);
完成的功能:为结点的第一个孩子赋值
(6) 函数的声明:void setBrother(Node* node);
完成的功能:为结点的右兄弟赋值
(7) 函数的声明:void setData(T* data);
完成的功能:为结点的数据域赋值
为数据域的学生会成员建立成员类(Member),其类定义如下:
class Member
{
《学生会组织机构管理系统的设计与实现》
第 5页 共 23页
public:
Member(string position, string name, string sex, string grade, int classes); //有参构造函
数
//打印数据
void print(void);
string getPosition() const { return _position; }//获取学生职务
string getName() const { return _name; } //获取学生姓名
string getSex() const { return _sex; } //获取学生性别
string getGrade() const { return _grade; }//获取学生所在年级
int getClasses() const { return _classes; }//获取学生所在班级
//操作符重载用来判断结点中数据是否相等,若相等则返回 1 否则返回 0
int operator==(Member& stu) const
{
return _name == stu.getName()
&& _sex == stu.getSex()
&& _grade == stu.getGrade()
&& _classes == stu.getClasses()
&& _position == stu.getPosition();
}
private:
//学生会成员属性
string _position;
string _name;
string _sex;
string _grade;
int _classes;
//职位
//姓名
//性别
//年级
//班级
};
在成员类中,提供了如下成员函数:
(1) 函 数 的 声 明 : Member(string position, string name, string sex, string grade, int
classes);
完成的功能:初始化一个新的数据成员
(2) 函数的声明:void print(void);
完成的功能:打印出数据成员信息
(3) 函数的声明:string getPosition() const;
完成的功能:返回学生会成员的职务
(4) 函数的功能:string getName() const;
完成的功能:返回学生会成员的姓名
(5) 函数的声明:string getSex() const;
完成的功能:返回学生会成员的性别
(6) 函数的声明:string getGrade() const;
完成的功能:返回学生会成员的年级
(7) 函数的声明:int getClasses() const;
完成的功能:返回学生会成员的班级
(8) 函数的声明:int operator==(Member& stu) const;
完成的功能:比较数据域的值(即学生会成员的所有属性)是否相等,若相等返
《学生会组织机构管理系统的设计与实现》
第 6页 共 23页
回 1,否则返回 0
为学生会组织机构的管理建立树类(Tree),其类的定义如下:
template
class Tree
{
Node* _root;
T* _tempDate;
//指向根结点的头指针
//结点数据域中的数据
public:
Tree(T* data) {_root = new Node(data);}
//有参构造函数,初始化一棵树//的根
结点
{Release(_root);}
//析构函数,释放树中各结点的存储空间
~Tree(void)
void Insert(T* oldData, T* newData);
void DeleteNode(T* date);
void Update(T* oldData, T* newData);
Node* FindNode(std::string position,Function function); //查询函数
void LeverOrder(Function function);
//插入函数
//删除树中某结点及其孩子
//修改函数
//层序遍历树
private:
void Release(Node* node);
Node* FindNode(T* data);
void InsertBrother(Node* node,T* data);
void InsertChild(Node* node, T* data);
//析构函数调用
//插入函数调用
//插入兄弟结点
//插入第一个孩子结点
};
2.2 测试运行
在树类中,提供了如下成员函数:
(1) 函数的声明:Tree(T* data);
完成的功能:初始化一棵树
(2) 函数的声明:~Tree(void);
完成的功能:释放树的存储空间
(3) 函数的声明:void Insert(T* oldData, T* newData);
完成的功能:将新结点插入到合适的位置
例如将(文艺部员,刘琳,女,一,3 )插入到(文艺部长,王一,女,一,5)
的孩子结点中如图 2-1 所示:
《学生会组织机构管理系统的设计与实现》
第 7页 共 23页
图 2-1
(5) 函数的声明:void DeleteNode(T* date);
完成的功能:释放要删除结点及其孩子结点的存储空间
例如:删除(秘书长,李四,女,一,4)这个结点如图 2-2 所示:
《学生会组织机构管理系统的设计与实现》
第 8页 共 23页
图 2-2
(6) 函数的声明:void Update(T* oldData, T* newData);
完成的功能:修改结点的数据信息
例如要将(学习部长,刘一,女,二,4)修改为(学习部长,周瑜,男,二,5)
如图 2-3 所示:
图 2-3