数据结构课程设计-家谱系统的简易开发

源代码如下

(1)main.cpp

#include<stdio.h>
#include"family.h"
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
#define max 100
int main()
{
int choose;
char X;
Fam *b=NULL;
char *str=(char*)malloc(max*sizeof(char));
str[0]='\0';
cout<<"------------------------------"<<endl;
cout<<"-----0.退出              -----"<<endl;
cout<<"-----1.记录输入:         -----\t"<<endl;
cout<<"-----2.记录输出:         -----\t"<<endl;
cout<<"-----3.家谱记录存盘:     -----\t"<<endl;
cout<<"-----4.用括号法输出家谱: -----\t"<<endl;
cout<<"-----5.查找某人的儿子:   -----\t"<<endl;
cout<<"-----6.查找某人的祖先:   -----\t"<<endl;
cout<<"-----7.清除全部文件记录: -----\t"<<endl;
cout<<"------------------------------"<<endl;
cout<<"请按键选择进行相应的操作:"<<endl;
cout<<"choose=";
cin>>choose;
while(choose)
{switch(choose)
  {
  case 1: InputFam(&b,str);break;
  case 2: OutputFam(&b,str);break;
  case 3: Store(b,str); printf("文件已经保存!");break;
  case 4: DispFam(b); break;
  case 5: printf("请输入需要查找儿子的结点:");
          cin>>X;
          SearchXSon(b,X);
           break;
  case 6: printf("请输入需要查找祖先的结点:\n");
          cin>>X;
       Fam *p;
       p=SearchX(b,X);
           if(p!=NULL)
               SearchXAncestor(b,X);
           else
               printf("该结点不存在!");
           break;
  case 7:Distory(&b,str);
          printf("文件记录已经清除!");
          break;
  default:cout<<endl<<"Invalid input,input again.";
}
  cout<<endl<<"please choose again:"<<endl;
  cout<<"the choose =";
  cin>>choose;
}
return 0;
}


(2)family.cpp

#include "family.h"
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
void CreateFam(Fam **b,char *str)  //创建树
{
    Fam *S[MaxSize],*p=NULL;
    int top=-1,tag,j=0,d=0;
    char ch;1
     switch(ch)
     {
            case '(':
                d++;
                     top++;
                     S[top]=p;
                     tag=1;break;
            case ')':
                     top--;break;
            case ',':
                d--;
                     tag=2;break;
            default:
                    p=(Fam *)malloc(sizeof(Fam));
                    p->degree=d;
                    p->name=ch;
                    p->lchild=NULL;
                    p->rchild=NULL;
                    if((*b)==NULL)(*b)=p;
                    else
                    {
                        switch(tag)
                        {
                            case 1: S[top]->lchild=p;break;
                            case 2: S[top]->rchild=p;break;
                        }
                    }
        }
        ch=str[++j];
    }
}

void DestroyFam(Fam *&b)   //销毁家谱
{
    if (b!=NULL)
    {
        DestroyFam(b->lchild);
        DestroyFam(b->rchild);
        free(b);
    }
}
void InputFam(Fam **b,char *str)//记录输入
{
    if(str[0]=='\0')
    gets(str);
do
{
    printf("请以括号法输入需要输入的记录:\n");
    gets(str);
    if(str[0]=='\0')
    printf("输入的记录为空,请再次输入:\n");
}while(str[0]=='\0');
CreateFam(b,str);
printf("记录创建成功!");
}

void Distory(Fam **b,char *str)//清除全部的记录
{
(*b)=NULL;
FILE *fp;
fp=fopen("family.txt","w");
if(fp==NULL)
{
  printf("打开文件失败!");
  exit(1);
}
str="";
fclose(fp);
}
void OutputFam(Fam **b,char *str)//从文件中读出记录
{
        FILE *fp;
        if((fp=fopen("family.txt","r"))==NULL)
        {
            printf("不存在记录文件,要建立吗?\n建立请输入Y,否则按其他键:");
            if(getchar()=='Y')
            {
                fp=fopen("family.txt","w+");
                printf("记录文件“family.txt”已建立\n");
            }
            else
                exit(1);
        }
        else
        {
            if(!feof(fp))
                fscanf(fp,"%s",str);
            fclose(fp);
            CreateFam(b,str);
            printf("文件中记录已输出\n");
        }

}

void Store(Fam *b,char *str)//储存全部的结点记录
{
  Fam *p;
  p=b;
  FILE *fp;
  fp=fopen("family.txt","w+");
  if(fp==NULL)
  {
   printf("文件打开失败!");
   return;
  }
  else
  {
   if(p!=NULL)
   {
    fprintf(fp,"%s",str);
    fclose(fp);
   }
  }
}

void DispFam(Fam *b)//用括号法输出家谱记录
{
if(b!=NULL)
{printf("%c",b->name);
  if(b->lchild!=NULL||b->rchild!=NULL)
  {
      printf("(");
      DispFam(b->lchild);
    if(b->rchild!=NULL)
        {printf(",");
     DispFam(b->rchild);
        }
   printf(")");
  }
}
}

Fam* SearchX(Fam *b,char X)//查找结点X
{Fam *p;
if(b==NULL) return NULL;
else if(b->name==X) return b;
else
{
  p=SearchX(b->lchild,X);
  if(p!=NULL) return p;
  else
  {
      return SearchX(b->rchild,X);
  }
}
}


void SearchXSon(Fam *b,char X)//查找结点X的所有儿子
{
Fam *p,*q;
p=SearchX(b,X);      //找到节点X
if(p!=NULL)
{
          p=p->lchild;
          if(p==NULL)    //X没有孩子
          printf("节点%c没有儿子!",X);
          else
        {
                printf("节点%c的所有儿子为:",X);
                if(p!=NULL)
                printf("%c  ",p->name);
                q=p->rchild;
            while(q)
                {
                  printf("%c  ",q->name);
                  q=q->rchild;
                }
        }
}
else
         printf("该结点不存在!");
}

void TraverseBT(Fam *b,int d)//遍历家谱
{
    if(b!=NULL)
        if(b->degree<d)
        {
            printf("%c  ",b->name);
            if(b->lchild!=NULL)
                TraverseBT(b->lchild,d);
            if(b->rchild!=NULL)
                TraverseBT(b->rchild,d);
        }
}

void SearchXAncestor(Fam *b,char X)//查找结点X的所有祖先
{
    if(b==NULL)
    {
        printf("这是一棵空树!");
        return ;
    }
    Fam *p=SearchX(b,X);
    if(p->degree==0)
    {
        printf("X为根节点或其兄弟,没有祖先!");
        return;
    }
    printf("%c结点的祖先有:",X);
    TraverseBT(b,p->degree);
}
//a(b(c(,d),e),f)




(3)family.h

#ifndef FAMILY_H_INCLUDED
#define FAMILY_H_INCLUDED
#include "family.h"
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define MaxSize 100
typedef struct Fam
{
int degree; //人员年代
char name;//人员标志
struct Fam *lchild;//name的孩子
struct Fam *rchild;//name的兄弟
}Fam;
void CreateFam(Fam **b,char *str);//创建家谱记录
void DestroyFam(Fam *&b);   //销毁家谱
void InputFam(Fam **b,char *str);//记录输入
void Distory(Fam **b,char *str);//清除全部的记录
void OutputFam(Fam **b,char *str);//从文件中读出记录
void Store(Fam *b,char *str);//储存全部的结点记录
void DispFam(Fam *b);//用括号法输出家谱记录
Fam* SearchX(Fam *b,char X);//查找结点X
void TraverseBT(Fam *b,int d);//遍历家谱
void SearchXAncestor(Fam *b,char X);//查找结点X的所有祖先
void SearchXSon(Fam *b,char X);//查找结点X的所有儿子



#endif // FAMILY_H_INCLUDED



你可能感兴趣的:(数据结构课程设计-家谱系统的简易开发)