*/
#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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)