资源描述
题目四
D2H :设计一个学生信息管理系统,包括学生基本信息、成绩信息等。提供输 入、编辑、删除、查询的操作界面。数据库类型自选。
1、问题分析。
由题意得,这是一道数据库类型的题目,需要实现插入,修改,删除,查询四 个功能。
确立数据的存储结构,采取二叉树进行存储数据,每个结点包含学生的姓名与 学生的成绩。
通过二叉查找树进行插入、删除和查询工作。
二叉查找树的特性是左子树关键字均小于根的关键字,而右子树的关键字均大 于根的关键字。因此加入某一关键字只要逐一比较,依据关键字的大小往右或 者往左,便可找到关键字插入的位置。
二叉查找树的删除,当删除某一结点时,若删除的是叶结点,则直接删除,假 若删除的不是叶结点,则在左子树找到最大的结点或者在右子树找到最小的结 点,取代将被删除的结点。
二叉查找树的查询,决定关键字X是否在二叉查找树中,首先X先与根去比较, 若X等于根表示找到,如果乂大于树根,则往右子树查找;否则,到左子树查 找。
由于一个结点包含学生的姓名与成绩,题目要求要求编辑功能,学生的成绩具 有可变性,所以结点的关键字选取为学生的姓名。
对二叉树的遍历,写入数据,采取先序遍历:先遍历树根,然后遍历左子树, 再遍历右子树。
2、设计方案。
根据问题分析,设计程序:
1. 构造函数,使根结点为空,加载函数,将数据文件BinSearchTree.dat 加载到程序中;
2. 定义载入与保存方法,结点的名字初始为空,学生成绩为0,由于 BinSearchTree. Dat正常情况下能够使用,所以采取JAVA中对异常的处 理方法。使用try-throw-catch组合替代if-else语句。
3. 定义一个search方法,用来搜索某个结点,定义一个结点,当此结点不 为根结点时,如果目标结点小于此结点的关键字,向此结点的左子树搜 索,否则向右子树搜索。
4. 定义一个search_re_r方法,用来搜索右子树的替代结点,当替代结点 的不为空并且替代结点的左子树不为空时,使用替代结点的左子结点作 为替代结点。
5. 定义一个search_re_ 1方法,用来搜索左子树替代结点,当替代结点不 为空并且替代结点的右子树不为空时,使用替代结点的右子结点作为替 代结点,
6. 定义一个search_p方法,用来搜索父节点,当结点小于父节点,向左搜 索,直到搜索到位置,否则向右搜索。
7. 定义一个preorder方法,用来以先序法写入档案,采取递归方式,先遍 历树根,然后遍历左子树,再遍历右子树。
8. 定义一个access方法,用来将数据增加到二叉查找树中,调用search 方法,当增加的结点与树中结点重复时,显示结点已存在,否则,将学 生姓名与成绩存入结点,当树根为空时,结点保存为树根,当树根不为 空时,寻找数据插入点,小于关键字向左查找,大于关键字向右查找, 直至找到插入位置,将结点两端与树中其他结点相连。
9. 定义一个connect方法,用来调整二叉树的链接,调用search_p方法, 寻找到父结点,当结点为父结点的左子树时,使父结点的左端与结点的 右端相连,否则,父结点的左端为空,当结点为父结点的右子树时,使 父结点的右端与结点的左端相连,否则,父结点的右端为空。
10. 定义一个replace方法,用来寻找删除非叶结点的替代结点,调用 search_re_r、search_re_1和connect方法,先搜索右子树寻找替代结 点,当替代结点在右子树存在时,将右子树的最小结点作为替代结点, 当不存在时,搜索结点的左子树,讲左子树的最大结点作为替代结点, 调用connect方法,将结点间连接。
11. 定义一个removing方法,用来将数据从二叉查找树中删除,调用search 和replace方法,当找不到删除结点时,显示无法找到此结点;否则当 此结点不为叶节点时,利用replace方法,寻找替代结点,当此结点为 叶结点时,直接删除。
12. 定义插入(insert)方法,方法中要求用户输入学生姓名与成绩,方法 中调用access方法,讲输入数据存入。
13. 定义删除(delete )方法,当树根为空时,系统输出没有学生记录,否 则调用replace方法删除结点。
14. 定义编辑(modify )方法,当树根为空时,系统输出没有学生记录,否 则,调用search方法,找出结点,重新对结点中学生成绩赋值。
15. 定义查询展示(show)方法,当树根为空时,系统输出没有学生记录, 否则,调用search方法,找出此结点,系统输出结点的姓名与成绩信息。
16. 设计友好的界面,提示用户输入数字,并对系统输出的结果进行说明。
17. 寻找检查程序中的BUG。
3、流程图。
4.用户查询数据,show方法
5.退出,save方法,保存数据
Search_p 方法
Search-re-方法
Search-re-方法
Access方法
Search方法
Replac。方法
加载函数,写入档案
用户选择功能,调用相应方法
—1.用户录入数据,1庭。1方法
• 2.用户删除数据,delet(方法
*3.用户编辑数据,modify方法
4、测试数据、测试结果、
结果分析。
Removing 方法
Connect 方法
r
preorder方法
File loading...OK!
*******Welcome to
student
score
System**************
<1>
insert
<2>
delete
<3>
<4>
modify
search
quit
*******Welcome to
<5>
student
score
System**************
Enter your choice:
No student record
*******Welcome to student score System**************
<1> insert ~
<2> delete
<3> modify
<4> search
<5> quit
*******Welcome to student score System**************
Enter your choice: 1
======INSET INFORMATION======
Enter student's name: peter
Enter student's score:1
*******Welcome to student score System**************
<1> insert
<2> delete
<3> modify
<4> search
<5> quit
*******Welcome to student score System**************
Enter your choice: 3
======MODIFY STUDENT INFORMATION======
Enter student name: peter
Original Student name: peter
Original Student score: 1
Enter new student: 2
Information of student peter modified
*******Welcome to student score System**************
<1> insert
<2> delete
<3> modify
<4> search
<5> quit
*******Welcome to student score System**************
Enter your choice: 4
======SHOW STUDENT INFORMATION======
Enter student name: peter
Student name: peter
Student score: 2
*******Welcome to student score System**************
<1> insert
<2> delete
<3> modify
<4> search
<5> quit *******Welcome to student score System**************
Enter your choice: 2
—DELETE STUDENT INFORMATION—™
Enter student,s name: peter
Data of student peter deleted!
*******Welcome to student score System**************
<1> insert
<2> delete
<3> modify
<4> search
<5> quit
*******Welcome to student score System**************
Enter your choice: 5
File saving. . . OK!
当学生成绩为符点数时,系统无法识别,输入自然数能够满足题目中要求
5、相关运行界面。
=public votca i 卜
infbrmationmanage.java 岂
prihlia void loa.d_f [|
String naune - int a core-' 3; bnalEan done fHine;
Systen.. ocrt.print [^Fale leading. . . H); try {
mflie new CacalnpucStrean.(new } catch (lOExceprlon s|- {
Sir5T:eni. s-rTrpilncln | ^teilEd!") ?
S ysreni. s-Tr rpr inc Ln I ^B lnS ear clhl rte return;
1 wFiil€ | done = talse> {
try{
naita = Uxtiie. raaim F (F; sccze = in£lle.reo!(llfj.c ();
)
a atali. (ECFEjecepr 1 oel ecf) < done = true:
)
c ft tab (ICExaeptinn e*i < }
if dar.e ! —-tirus[
iCEess |r.Brne, scare);
}
Byste-. otit-pziTitln f'CX "R【 try{
inf lie. el cjse ();
} catch rlOExcecitaaK 巴卜{)
Fi IsInpccStrsaiii (
rdeu nor- rawidr
u 旦 xn het rch rz-ee . dat [卜匚
Dutline ] Console ES '
<|grnninaD&d> Bln&wrehTTi&ea) [Java Appircaflton] c\pn
.f I底•席回更)1 /日F -
ITq 3DtLde!LG record
*** ftfr* fcSfeiCO3t=. CO
scuienc score aysrem***
<1> iDsexr
<2> i-lete
<3> itodify
<?> s-sazet:
<5>
ri rf n fl rf ft H11 >ZDIT^ tQ
3t'j.dent jscore Syst—
Enter yaur chaj.ze:
™™I3£ET I3FCRMATID}]™" Enter atedert s najr,e: w Enter atuien匚『js accTe: 1
****** *Welccoire co stcdenc a core Sysrem** * <1> inserr <2> lelete <3> moditj? <4> search <5> q;Qlc
****** *Welccarje co a du. le tic score Sysrem.*** EDtez yDUE eliaices 3
==^KCDIEY snjrorr IZ-ITOBKiTIGK== Enter sctuieeic Eiams: cecei Cr±giEL!ail 5tuMnc r.air.e: petisr
Cx±gir.a± S t%id-=r.t scare: LOO Enter new studejit: ZCD In±crn-atx=D sf :3t匚注三二匚 peter xed
6、关键代码
1. 将新增数据添加到二叉树中:
public void access(String name, int score)
{
Student node, prev = null ; if (search(name) != null ) {
System. out .println( "Student "+ name + "has existed!" );
return ;
)
ptr = new Student();
ptr . name = name;
ptr . score = score;
ptr . llink = ptr . rlink = null ;
if (root == null) root = ptr ;
else
{
node = root ;
while (node != null )
{
prev = node;
if (ptr . name .compareTo(node. name ) < 0) node = node. rlink ;
else
node = node. rlink ;
)
if (ptr . name .compareTo(prev.
name ) < 0)
prev. llink = ptr ;
else
prev. rlink = ptr ;
)
)
2. 将数据从二叉查找树中删除:
public void removing(String name)
{
Student del_node;
if ((del-node = search(name)) == null )
{
System. out .println( "Student "+ name +" not found!" );
return ;
)
if (del-node. llink != null ||del_node. rlink != null )
del_node = replace(del_node);
else
if (del_node == root ) root = null ;
else
connect(del_node, 'n');
del_node = null ;
System. out .println( "Data of student "
+ name + " deleted!");
3. 寻找非叶结点的替代结点:
public Student replace(Student node)
Student re_node;
if ((re_node = search_re_r(node. rlink )) == null ) re_node= search_re_l(node. llink );
if (re_node. rlink != null ) connect(re_node, 'r');
else if (re_node. llink != null ) connect(re_node, 'l');
else connect(re_node, 'n');
node. name = re_node. name ; node. score = re_node. score ; return re_node;
}
4. 调整二叉树的链接: public void connect(Student node, char link)
{
Student parent;
parent = search_p(node);
if (node. name .compareTo(parent. name )<0)
if (link ==
'r' )
parent.
llink
=node.
rlink ;
else
parent.
llink
= null
;
else
if (link ==
'1')
parent.
rlink
=node.
llink ;
else
parent.
rlink
= null
;
}
5. 先序法将数据写入档案:
public void preorder(Student node)
if (node != null)
{
try {
outfile .writeUTF(node.name );
outfile .writeInt(node.score );
} catch (IOException e) {} preorder(node.llink );
preorder(node.rlink );
)
)
6. 搜索目标结点:
public Student search(String target) {
Student node;
node = root ;
while (node != null ){
if (pareTo(node. name ) == 0) return node;
else if (pareTo(node. name ) < 0) node = node. llink ;
)
return node;
)
7. 搜索右子树替代结点:
Student search_re_r(Student node) {
Student re_node;
re_node = node;
while (re_node != null &&re_node. llink != null ) re_node = re_node. llink ;
return re_node; )
8. 搜索左子树替代结点:
public Student search_re_l(Student node) {
Student re_node;
re_node = node;
while (re_node != null &&re_node. rlink != null ) re_node =re_node. rlink ;
return re_node;
)
9. 搜索node的父结点:
Student parent;
parent = root ;
while (parent != null ){
if (node. name .compareTo(parent. name ) < 0)
if (node. name .compareTo(parent. llink . name ) == 0) return parent;
else
parent = parent. llink ;
else
if (node. name .compareTo(parent. rlink . name ) == 0) return parent;
else
parent = parent. rlink ;
}
return null ;
}
展开阅读全文