C语言家谱如何分层输出

C语言家谱如何分层输出,第1张

C语言家谱分层输出代码如下:

*/

#include

#include

#include

#include

#include"map.h"

#defineMAXN100

#defineMAXMEM100

#defineElemtypechar

//

//树

typedefstructBiTNode

{undefined

intmark//标记

intlevel

charname[50]//姓名

charbirthday[50]//生日

charaddress[MAXN]//住址

boolmarriage//婚否(true表示结婚,false表示没结婚)

boollive//建在(true表示活着,false表示过世)

boolsex//性别(true表示男,false表示女)

charlivemassage[50]//死亡日期(如果其已经死亡)

Elemtypedata//

structBiTNode*lc,*rc

}BiTNode,*BiTree

//

//树的相关 *** 作

charnametemp[50]//姓名

charbirthdaytemp[50]//生日

charaddresstemp[MAXN]//住址

boolmarriagetemp//婚否(true表示结婚,false表示没结婚)

boollivetemp//建在(true表示或者,false表示过世)

boolsextemp

charlivemassagetemp[MAXN]//死亡日期(如果其已经死亡)

charch//额外使用

intleveltemp//人的代数

intNth//显示第n代人时要用

charsearchdata[50]

charsearchname[50]

intcount//计数

intchoice//各种选择

intuse

BiTreetemp

structBiTNodeList

{undefined

BiTreedata

BiTNodeList*next

}

BiTNodeList*Li

st

voidCreatBiTree(BiTree&T,FILE*in)//建立双链二叉树

{undefined

fscanf(in,"%c",&ch)

//printf("%c\n",ch)

if(ch=='@')

层,意为①重叠起来的东西;重叠起来的东西中的一部分:层次|表层|大气层。②重叠;重复:层峦叠嶂|层出不穷。③量词,用于可以分出层次的事物:三层楼|两层意思|擦掉一层灰。

家谱:又称族谱、宗谱等。是一种以表谱形式,记载一个家族的世系繁衍及重要人物事迹的书。家谱是一种特殊的文献,就其内容而言,是中华文明史中具有平民特色的文献,记载的是同宗共祖血缘集团世系人物和事迹等方面情况的历史图籍。据研究表明,中华古姓来源于图腾崇拜,系氏族徽号或标志。

给你一个二叉树,你自己再想想。

/* ****************二叉树有关算法*************** */

/*********设计目标:教学演示**********************/

#include "stdio.h"

#include "conio.h"

#include "stdlib.h"

#define stackinitsize 100

#define OK 1

#define ERROR 0

#define OVERFLOW -1

typedef int TElemType

typedef int Status

//一一一一一二叉树的二叉链表存储表示一一一一一

typedef struct BiTNode{

TElemType data

struct BiTNode *lchild,*rchild //左右孩子指针

}BiTnode,*SElemType,*BiTree

typedef struct{

//该堆栈的元素是指针类型的

//base和top均是指向指针的指针

SElemType *base

SElemType *top

int stacksize

int tag

}sqstack//堆栈结构

//一一一一一基本 *** 作的函数原型说明(部分)一一一一一

Status CreateBitree(BiTree &T)

//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树。

//构造二叉链表表示的二叉树T.

void PreOrder(BiTree T)

//采用二叉链表存储结构,先序遍历二叉树T,对每个结点的访问就是输出它的值

void Inorder(BiTree T)

//采用二叉链表存储结构,中序遍历二叉树T,对每个结点的访问就是输出它的值

void Postorder(BiTree T)

//采用二叉链表存储结构,后序遍历二叉树T,对每个结点的访问就是输出它的值。

void InitStack(sqstack &s)//初始化堆栈

{

s.base=(SElemType*)malloc(100*sizeof(SElemType))

if(!s.base) return

s.top=s.base

s.stacksize=100

return

}

int StackEmpty(sqstack s) //栈空判别

{return(s.top==s.base)

}

void Pop(sqstack &s,SElemType &e)//d栈

{

e=*--s.top

}

Status GetTop(sqstack s,SElemType &e)

{

if(s.top==s.base) return ERROR

e=*(s.top-1)

return OK

}

void Push(sqstack &s,SElemType e)//将元素压入堆栈

{

*s.top++=e

}

Status CreateBiTree(BiTree &T){

//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树。

//构造二叉链表表示的二叉树T.

char ch

ch=getche()

if(ch==' ') T=NULL

else{

if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) return(OVERFLOW)

T->data=ch//生成根结点

CreateBiTree(T->lchild)//构造左子树

CreateBiTree(T->rchild)//构造右子树

}

return OK

}//CreateBiTree

void PreOrder(BiTree T)

//采用二叉链表存储结构,先序遍历二叉树T,对每个结点的访问就是输出它的值

{

if(T)

{

printf("%c",T->data)

PreOrder(T->lchild)

PreOrder(T->rchild)

}

}//preOrderTraVerse

void InOrder(BiTree T)

//采用二叉链表存储结构,中序遍历二叉树T,对每个结点的访问就是输出它的值

{

if(T)

{

InOrder(T->lchild)

printf("%c",T->data)

InOrder(T->rchild)

}

}//inOrderTraVerse

void PostOrder(BiTree T)

//采用二叉链表存储结构,后序遍历二叉树T,对每个结点的访问就是输出它的值

{

if(T)

{

PostOrder(T->lchild)

PostOrder(T->rchild)

printf("%c",T->data)

}

}//posOrderTraVerse

void preord1(BiTree T)

//采用二叉链表存储结构,先序遍历二叉树T的非递归算法。

{sqstack s

BiTree p

InitStack(s)

if(T)

{

Push(s,T) //根结点入栈

while(!StackEmpty(s))//栈不为空时循环

{Pop(s,p)

printf("%c",p->data) //退栈并访问该结点

if(p->rchild) Push(s,p->rchild )//右孩子入栈

if(p->lchild) Push(s,p->lchild )//左孩子入栈

}

}

}

void inord1(BiTree T)

//采用二叉链表存储结构,中序遍历二叉树T的非递归算法。

{

return

}//Inord1

void inord2(BiTree T)

//采用二叉链表存储结构,visit是对数据元素 *** 作的应用函数。

//中序遍历二叉树T的非递归算法,对每个数据元素调用函数visit。

{

}//Inord1

void posord1(BiTree T)

//采用二叉链表存储结构,后序遍历二叉树T的非递归算法。

{

BiTree p

BiTree stack[100]

int tag[100],top=0

p=T

do

{

while(p)//扫描左子树

{

top++

stack[top]=p

tag[top]=0

p=p->lchild

}

while(top>0&&tag[top]==1)

{ //p所指结点为无左子树的结点或其左子树已经遍历过

p=stack[top]

top--

printf("%c",p->data )//访问结点

}

if(top>0)

{

p=stack[top]

p=p->rchild //扫描右子树

tag[top]=1//表示当前的右子树已访问过

}

else break

}while(p||top!=0)

}

void main()

{

BiTree t

printf("\n请按先序遍历输入二叉树(当左右子树为空时用空格输入)\n")

CreateBiTree(t)

printf("\n该二叉树的先序遍历为:\n")

PreOrder(t)

printf("\n该二叉树的先序遍历为:(用非递归调用)\n")

preord1(t)

printf("\n该二叉树的中序遍历为:\n")

InOrder(t)

printf("\n该二叉树的中序遍历为:(用非递归调用1)\n")

inord1(t)

printf("\n该二叉树的中序遍历为:(用非递归调用2)\n")

inord2(t)

printf("\n该二叉树的后序遍历为:\n")

PostOrder(t)

printf("\n该二叉树的递归后序遍历为:\n")

posord1(t)

}

这是一个二维数组的结构化函数,我把你那边的n的值改为50,表示最多能输入50个人的家谱信息

#include<stdio.h>

struct people

{

char name[10]

char fathername[10]

}

void main()

{

struct people family[50]

int i,row=0

char c

for(i=0i<50i++)

{

printf("请输入第%d个人的姓名:",i+1)

gets(family[i].name)

printf("请输入第%d个人父亲的姓名:",i+1)

gets(family[i].fathername)

printf("是否继续(y/n):")

scanf(" %c",&c)

if(c=='n'||c=='N')

break

}

row=i+1

printf("儿子姓名\t父亲姓名\n")

for(i=0i<rowi++)

{

printf("%s\t%s\n",family[i].name,family[i].fathername)

}

}

就这么简单,看看是不是这样的,上面的row是你实际输入用户数量的行数,每输完一组用户的信息,都会提示是否继续,选y继续循环,n退出循环row=i+1


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11555098.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存