资源简介

数据结构课设,简单家谱管理系统.只给出了源代码。还有自己创建工程进行运行

资源截图

代码片段和文件信息

#include“genealogy.h“

GEnealogy::GEnealogy()
{
T=NULL;//开始为空家谱
}

GEnealogy::~GEnealogy()
{
DestroyGEnealogy();//释放资源
}

void GEnealogy::NewGEnealogy()
{
//建立一空家谱,
DestroyGEnealogy();//删除原有家谱
T=NULL;
}

void GEnealogy::CreateGEnealogy()
{
DestroyGEnealogy();//删除原来家谱树结构
    int n=0;//初始化数组下标,用来看有几多个数据
fstream f(“1.dat“ios::binary|ios::in);//以二进制读方式打开
  if(!f)
{
  cerr<<“File can‘t be open“<  return;
}
f.seekg(0ios::end);//指针移到文件尾
long posEnd=f.tellg();//记录文件尾位置
f.seekg(0ios::beg);//指针移到文件头
person ParentT=new CSNode;
ParentT=NULL;
person temp[max_char_num];//定义读取数据的数组
for(int i=0;i temp[i]=new CSNode;//初始化一个地址值,且不能为空否则出错
if( posEnd == f.tellg( ) )             
{
cout<<“It‘s a null Genealogy“< return;
}
while( posEnd != f.tellg() )//从头到尾读取二进制数据
{
f.read((char*)&(temp[n]->data)sizeof(Info));
n++;
}
NewGEnealogy();
    T=temp[0];T->firstchild=T->nextsibling=NULL;//将第一个赋给根结点
for(int j=1;j {
FindByName(TParentTtemp[j]->data.parentname);
if(ParentT)
{
temp[j]->firstchild=temp[j]->nextsibling=NULL;
temp[j]->parent=ParentT;
if(ParentT->firstchild)
{
InsertSibling(ParentT->firstchildtemp[j]);
}
else
ParentT->firstchild=temp[j];
}
}
f.close();//关闭文件流
}

void DestroyNode(person &pnode)
{
//删除一结点
if(pnode)
{
delete pnode;
pnode=NULL;
}
}


void GEnealogy::DestroyGEnealogy()
{
//删除家谱,释放资源
PostOrderTraverse(TDestroyNode);
}

void GEnealogy::PostOrderTraverse(person &Tvoid (__cdecl *Visit)(person &T))
{
//后序遍历二叉树,并执行visit函数
if(T)
{
PostOrderTraverse(T->firstchildVisit);
PostOrderTraverse(T->nextsiblingVisit);
(*Visit)(T);
}
}

void GEnealogy::PreOrderTraverse(fstream &fperson &T void (__cdecl *Visit)(fstream &fperson &T))
{
//先序遍历二叉树,并执行visit函数
if(T)
{
(*Visit)(fT);
PreOrderTraverse(fT->firstchildVisit);
PreOrderTraverse(fT->nextsiblingVisit);
}
}

void SaveNode(fstream &f person &pnode)
{
//以二进制形式保存一个结点的info信息
if(pnode)
{
f.write ( (char * )&pnode->data sizeof(Info) ) ;
}
}

void GEnealogy::SaveGEnealogy()
{
    //保存二叉树到文件
fstream f(“1.dat“ios::binary|ios::out);//以二进制写方式打开文件
  if(!f)
{
  cerr<<“File can‘t be open“<  return;
}
PreOrderTraverse(fTSaveNode);//调用先序遍历写二叉树信息到文件
f.close();//关闭文件
}

person& GEnealogy::GetRoot()
{
//返回家谱的根结点
return T;
}


void GEnealogy::ReadNode(fstream &fperson &pnode)
{
//读取文件的Info信息到pnode中去,供createGenealogy()调用
f.read((char*)&pnode->datasizeof(Info));

}

void GEnealogy::FindByName(person& Tperson& Tnamechar* name)//search the name in info from root T
{
//查找姓名=name的人,若在家谱中,用Tname返回,否则Tname为空,Tname初始为空
if(T)
{
if(strcmp(T->data.namename)==0) //用string库的strcmp()比较两个字符串,若相等,则找到符合条件的
Tname=T;
else
{

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        4573  2005-04-02 23:27  genealogy.h
     文件        4682  2005-04-02 18:21  main.cpp
     文件       23060  2005-04-03 01:17  bigwork.cpp

评论

共有 条评论