
正文
java实现家谱系统代码的简单介绍
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
用二叉树实现家谱运算
C++语言: 二叉树实现的简单家谱树
/*
* File Name: BiTree.cpp
* Author: Geng Lequn[glq2000@126.com]
* Thur July 1 2010
*Discription: 建立二叉家谱树,实现输入任意两个人的名字,查找得到其关系
*/
#include iostream
#include string
#include cstring
#include cstdlib
#include vector
#include math.h
using namespace std;
typedef struct _Node
{
string sex; //性别 m 男; f 女
string name; //此人的姓名
string spause; //配偶的姓名
unsigned short level; //层次 辈分最高一层为1,下一层为为2,以此类推
struct _Node* l_child; //指向其第一个孩子的指针
struct _Node* r_brother; //指向其某一个兄弟姐妹的指针, 即左孩子为其后代,右孩子为其兄弟姐妹
struct _Node* btr; //指向其父亲或者母亲的指针
_Node():level(0),l_child(NULL),r_brother(NULL),btr(NULL){cout"constructor."endl;}
~_Node(){coutname" destructor."endl;}
}Node, *PNode;
void CreateBiTreePreOrder(PNode pn, PNode pback, unsigned short depth);//建立二叉家谱树,以先序方式
void VisitBiTreePreOrder(PNode root); //前序遍历此二叉树
void TellRelation(PNode root); //判断两人关系
void DestroyBiTreePostOrder(PNode root); //销毁二叉树,释放节点占用的空间
void FindPersonMiddleOrder(PNode root, string name, PNode presult); //返回家谱中指向某人的指针,找不到返回NULL
Node *root=NULL; //全局变量,二叉树的根节点
unsigned findPersonFlag = 0; //标志位,0 没找到; 1 找到,找到后就不再搜索直接返回;利用此flag可避免将整个tree遍历一遍(若该name在tree中存在的话)
int main()
{
cout"请按先序遍历的顺序根据提示输入家谱信息,不存在则输入\"#\""endl;
CreateBiTreePreOrder(root, NULL, 1);//建立二叉家谱树,以先序方式
VisitBiTreePreOrder(root); //前序遍历此二叉树
TellRelation(root); //判断两人关系
DestroyBiTreePostOrder(root); //销毁二叉树
getchar();getchar();getchar();
return 0;
}
/*
* function:建立二叉家谱树,以先序方式
* argument:
* pn: 指向二叉树节点的引用
* pback: pn这个节点的btr指针的值,即指向其parent的指针
* depth: 该节点的层次,分最高一层为1,下一层为为2,以此类推
*/
void CreateBiTreePreOrder(PNode pn, PNode pback, unsigned short depth)
{
string str;
cinstr; //输入该人信息,格式是 sex-name-spausename,如不存在则输入#
if(str == "#") //如: M-tom-marry, 表示此人叫tom, 男性, 配偶名字marry
{
pn = NULL;
return;
}
//如果是自定义的struct/class,应该使用构造函数。如果是内建数据类型,
//比如int,应该memset。 当然,更好的建议是使用vector取代new出来的数组
pn = new Node;
//处理输入的字符串
vectorstring v;
for(size_t b=0, e=str.find('-'); ; e=str.find('-', b))
{
if(e == string::npos)
{
v.push_back(str.substr(b));
break;
}
else
v.push_back(str.substr(b, e-b));
b = e+1;
}
//初始化该节点
pn-sex = v[0];
pn-name = v[1];
pn-spause = v[2];
pn-btr = pback;
pn-level = depth;
//递归建立左右子树的节点
CreateBiTreePreOrder(pn-l_child, pn, depth+1); //注意后两个参数的值
CreateBiTreePreOrder(pn-r_brother, pback, depth); //注意后两个参数的值
}
/*
* function: 前序遍历此二叉树
*/
void VisitBiTreePreOrder(PNode pn)
{
if(!pn)
return;
coutendl"sex:"pn-sexendl;
cout"name:"pn-nameendl;
cout"spause:"pn-spauseendl;
cout"level:"pn-levelendl;
cout"father's name:"((pn-btr == NULL)?"NULL":pn-btr-name)endl;
cout"======================"endl;
VisitBiTreePreOrder(pn-l_child);
VisitBiTreePreOrder(pn-r_brother);
}
/*
* function: 中序遍历找到家谱中的一个人,返回其指针,若找不到,返回NULL
* isSpause 1表示是找到的节点的配偶 0表示不是所找到的节点的配偶
*/
void FindPersonMiddleOrder(PNode pn, string name, PNode presult)
{
if(!pn)
return;
FindPersonMiddleOrder(pn-l_child, name, presult);
if(findPersonFlag) return;
if(name == pn-name || name == pn-spause)
{
presult = pn;
findPersonFlag = 1; //全局标志位,0 没找到; 1 找到,找到后就不再搜索直接返回;利用此全局flag可避免将整个tree遍历一遍(若该name在tree中存在的话)
return; //下次使用前不要忘记置为0
}
FindPersonMiddleOrder(pn-r_brother, name, presult);
}
/*
* function: 判断两人关系,若两人中至少一人不在树中,则两人无关系.
若两人在树中,先判断两人是否同层次,若同层,判断是否是亲兄弟姐妹;
若不同层,设辈分大的人为A,辈分小的人为B,判断A和B是亲的还是表的,
比如,A为男性,且比B大一倍,判断A是否为B的爸爸,或亲叔叔(舅舅),或表叔叔(舅舅)
简单起见,此处没有区分是叔叔还是舅舅.
比如,A为男性,且比B大两倍,判断A是否为B的亲爷爷(姥爷),或亲爷爷(姥爷)的亲兄弟
,或亲爷爷(姥爷)的表兄弟
简单起见,此处没有区分是叔叔和舅舅等做进一步区分.
简单起见,查询时只输入节点中的name,不查询spause,否则处理起来太麻烦
*/
void TellRelation(PNode pn)
{
string name1, name2;
//p1指向name1, p2指向name2, pbig指向辈分大的,psmall指向辈分小的
PNode p1 = NULL, p2 = NULL, pbig = NULL, psmall = NULL;
int differ = 0; //两人辈分数的差别
string title;
Label:
coutendl"输入想查询关系的两个人的名字,不想查则将两人名字输成#:"endl;
while(cinname1 cinname2)
{
if(name1=="#" name2=="#") return;
p1 = NULL; p2 = NULL; //因为程序是循环执行的,需要将上次遗留的值清掉
findPersonFlag = 0;
FindPersonMiddleOrder(root, name1, p1);
findPersonFlag = 0;
FindPersonMiddleOrder(root, name2, p2);
if(!p1 || !p2) //若有一个为空或都为空,说明至少有一个人不在家谱中,故两人无亲缘关系
{
coutname1((!p1)?" 不在":" 在")" 家谱树中."endl;
coutname2((!p2)?" 不在":" 在")" 家谱树中."endl;
coutname1" 和 "name2" 间没有关系."endlendl;
goto Label;
}
differ = (int)abs(p1-level - p2-level);
if(!differ) //辈分一样大
{
if(p1-sex == p2-sex)
{
if(p1-sex == "M") title = "兄弟关系";
else title = "姐妹关系";
}
else title = "兄妹(姐弟)关系.";
if(p1-btr == p2-btr) //parent相同
coutname1" 和 "name2" 间是 "" 亲 "titleendl;
else
coutname1" 和 "name2" 间是 "" 表 "titleendl;
}
else //辈分不一样大
{
if(p1-level p2-level) {pbig = p1; psmall = p2;}
else {pbig = p2; psmall = p1;}
switch(differ)
{
case 1:
if(psmall-btr == pbig)
title = ((pbig-sex == "M")?"爸爸.":"妈妈.");
else
{
if(psmall-btr-btr == pbig-btr)
title = ((pbig-sex == "M")?"亲叔(舅).":"亲姑(姨).");
else
title = ((pbig-sex == "M")?"表叔(舅).":"表姑(姨).");
}
break;
case 2:
if(psmall-btr-btr == pbig)
title = ((pbig-sex == "M")?"爷爷(姥爷).":"奶奶(姥姥).");
else
{
string tmp = ((pbig-sex == "M")?"兄弟.":"姐妹.");
if(psmall-btr-btr-btr == pbig-btr)
title = ((psmall-btr-btr-sex == "M")?"爷爷(姥爷)的亲":"奶奶(姥姥)的亲") + tmp;
else
title = ((psmall-btr-btr-sex == "M")?"爷爷(姥爷)的表":"奶奶(姥姥)的表") + tmp;
}
break;
default:
string tmp2;
PNode pt = psmall;
int n = differ-2; //计算"老"字 (即grand这个字) 出现的个数
for(int i=0; in; ++i)
tmp2 += "老";
for(int i=0; idiffer; ++i)
pt = pt-btr;
if(pt == pbig)
title = tmp2 + ((pbig-sex == "M")?"爷爷(姥爷).":"奶奶(姥姥).");
else
{
string tmp3 = ((pbig-sex == "M")?"兄弟.":"姐妹.");
if(pt-btr == pbig-btr)
{title = tmp2 + ((pt-sex == "M")?"爷爷(姥爷)的亲":"奶奶(姥姥)的亲"); title+=tmp3;}
else
{title = tmp2 + ((pt-sex == "M")?"爷爷(姥爷)的表":"奶奶(姥姥)的表"); title+=tmp3;}
}
break;
}
coutpbig-name" 是 "psmall-name" 的 "titleendl;
}
goto Label;
}
}
/*
* function: 后序遍历销毁此二叉树,释放节点占用的内存空间
*/
void DestroyBiTreePostOrder(PNode pn)
{
if(!pn) return;
DestroyBiTreePostOrder(pn-l_child);
DestroyBiTreePostOrder(pn-r_brother);
delete pn;
}
相关问答
Q1: 家谱管理系统设计与实现。编制一个家谱资料管理软件,实现对一个家族所有的资料进行收集整理。
这玩意都到百度来,来错地方了,去专门代编程序设计网站吧,花点钱,会让你很满意的,不舍得花钱的话,就去百度贴吧吧,那里人多
Q2: java二叉树家谱实现
mport java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class Randomtree extends JFrame {
private JTree tree;
public static String[] school = { "初中课程", "高中课程", "大学课程" };
public static String[] color = { "颜色", "运动", "食物" };
public static String[] plant = { "植物", "动物", "人" };
public static String[][] school2= {
{ "初中一年级", "初中二年级", "初中三年级"}, {"高中一年级", "高中二年级",
"高中三年级"}, {"大学一年级", "大学二年级", "大学三年级", "大学四年级"} };
public static String[][] color2 = {
{ "绿色", "白色", "红色"}, {"足球", "篮球",
"羽毛球"}, {"面包", "牛奶", "披萨", "热狗"} };
public static String[][] plant2 = {
{ "玫瑰花", "月季花", "海棠花"}, {"猪", "狗",
"猫"}, {"黄种人", "黑种人", "白种人", } };
public static void main(String[] args) {
// TODO 自动生成方法存根
new Randomtree();
}
public Randomtree() {
super();
final Random random=new Random();
setVisible(true);
setSize(300,400);
tree = new JTree();
final JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(0, 40));
getContentPane().add(panel, BorderLayout.NORTH);
final JScrollPane scrollPane = new JScrollPane();
scrollPane.setPreferredSize(new Dimension(300, 350));
getContentPane().add(scrollPane, BorderLayout.CENTER);
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int k=random.nextInt(3);
tree=getTree(k);
scrollPane.setViewportView(tree);
}
});
scrollPane.setViewportView(null);
button.setText("随机生成树");
panel.add(button);
pack();
}
protected JTree getTree(int n) {
String[] second=null;
String[][] three=null;
if(n==0){second=school; three=school2;}
if(n==1){second=color; three=color2;}
if(n==2){second=plant; three=plant2;}
DefaultMutableTreeNode root=new DefaultMutableTreeNode("root");
for(int i=0;isecond.length;i++){
DefaultMutableTreeNode secondNode=new DefaultMutableTreeNode(second[i]);
for (int j=0;jthree[i].length;j++){
DefaultMutableTreeNode threetNode=new DefaultMutableTreeNode(three[i][j]);
secondNode.add(threetNode);
}
root.add(secondNode);
}
JTree tree=new JTree(root);
tree.expandRow(1);
tree.expandRow(5);
tree.expandRow(9);
return tree;
}
}
简单的 例子你可以模仿一下
Q3: 运用Java数据结构的知识创建树,内容是族谱。
每一个节点有一个成员变量引用下一个节点就行了。
大致实现了一下单向链表 没有加入异常也没有仔细考虑实现的代码的效率,可以参考下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
public class LinkListTest {
public static void main(String[] args) {
LinkListString ll=new LinkListString();
ll.add("a");
ll.add("b");
ll.add("c");
ll.add("d");
ll.remove(1);
System.out.println(ll.get(0));
System.out.println(ll.get(1));
System.out.println(ll.get(2));
System.out.println(ll.get(3));
System.out.println(ll.size());
}
}
class LinkListT{
private NodeT frist=null;
private NodeT last=null;
private int size=0;
public void add(T t){
if(frist==null){
NodeT node=new NodeT();
node.setT(t);
size++;
frist=node;
last=node;
}else{
NodeT node=new NodeT();
node.setT(t);
last.setNextNode(node);
size++;
last=node;
}
}
public T get(int i){
if(i=0isize){
NodeT nod=null;
for(int n=0;n=i;n++){
if(n==0)
nod=frist;
else
nod=nod.getNextNode();
if(i==n){
return nod.getT();
}
}
}
return null;
}
public void remove(int i){
if(i=0isize){
if(size2){
frist=null;
last=null;
size=0;
}else{
size--;
if(i==0){
frist=frist.getNextNode();
}else{
NodeT nod1=null;
NodeT nod2=null;
for(int n=0;n=i;n++){
if(n==0){
nod1=frist;
nod2=frist;
}else{
nod2=nod1;
nod1=nod1.getNextNode();
}
if(i==n){
if(nod1!=null)
nod2.setNextNode(nod1.getNextNode());
else{
nod2.setNextNode(null);
last=nod2;
}
}
}
}
}
}
}
public int size(){
return size;
}
}
class Node T{
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public NodeT getNextNode() {
return nextNode;
}
public void setNextNode(NodeT nextNode) {
this.nextNode = nextNode;
}
private T t;
private NodeT nextNode=null;
}
Q4: 速求:数据结构课程设计 ——简易家谱系统 不能用二叉树 要代码
很难吗?树结构哦。看你数据结构学java实现家谱系统代码的怎么样呗。呵呵java实现家谱系统代码,java实现家谱系统代码我先想到的数据结构是双亲孩子表示法,当然查找关系的时候就要进行一些条件设置,比如祖孙的关系数大于父子的关系数2,兄弟拥有相同的双亲,堂兄弟的双亲是兄弟,回溯到相同的祖先结点则有共同的祖先咯。
java实现家谱系统代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、java实现家谱系统代码的信息别忘了在本站进行查找喔。







