#include <stdlib.h>
//1 根据二叉树的性质5,结点按完全二叉树来编号,则根据结点编号,
// 就可算出其双亲结点的编号,以及该结点是左孩子还是右孩子,
// 这样一来,就可把该结点的指针赋予双亲结点的相应指针域。
// 怎样找到双亲结点呢?,在输入双亲结点的同时要把结点的指针
// 保存起来。也就是说,要设计一个指针数组,来保存每个结点指针。
// 这样,当输入下层结点时,才能找到它的双亲。
//2 回想单链表的建立过程,单链表建立过程中,只需把当前结点,
// 当成前驱结点,故只需设计一个指针变量即可。
typedef char ElementType
typedef struct node //二叉树链表结点
{
ElementType data
struct node *lchild,*rchild//左、右孩子指针
}BinNode,*BinTree //结点和结点指针的标识符
BinNode * creat(void) //建二叉树链表(返回根结点的指针)
{
int i,j
ElementType x
BinNode *q,*s[20]//结点指针、辅助数组(存放结点的指针,该结点有可能是双亲结点)
BinNode *t=NULL //根结点指针(目前是空树,生成树后要返回根结点指针)
printf("\n 请输入结点编号i和结点值x")
printf("\n 如:1A 2B 3C 4D 5E 7F 00(全为0,输入结束)")
printf("\n 或:1A 2B 3C 4D 6F 7G 00(全为0,输入结束)")
printf("\n 或:1A 2B 3C 5E 7G 15M 00(全为0,输入结束)\n")
scanf("%d%c",&i,&x)//输入结点编号及结点值
while((i!=0)&&(x!=0))
{
q=(BinNode *)malloc(sizeof(BinNode))//申请结点内存
q->data=x //保存数据
q->lchild=NULL
q->rchild=NULL
s[i]=q//s[i]存放第i号结点的指针
if(i==1)//1号结点是根结点
t=q //保存根结点指针,以备返回
else
{
j=i/2 //由该结点号求双亲结点号
if((i%2)==0)
s[j]->lchild=q//i为偶数是左孩子,该结点指针存入双亲结点的左孩子指针
else
s[j]->rchild=q//i为奇数是右孩子,该结点指针存入双亲结点的右孩子指针
}
scanf("%d%c",&i,&x)//继续输入结点编号和结点值
}
return t //返回根结点的指针(二叉链表的指针)
}
void DisplayBinTree(BinTree T)//用缩进表示二叉树
{
BinTree stack[100],p//栈(结点指针数组)、当前结点指针
int level[100] //栈(每层根结点对应的空格 数 )
int flag[100] //栈(flag[]=0,1,2分别表示是根结点、左子树、右子树 )
int top,n,i //栈顶指针,空格个数,循环变量
if(T!=NULL)//若有根结点
{
top=1 //1号结点(根结点 )
stack[top]=T //入栈(保存根结点指针)
level[top]=1 //显示空格的个数
flag[top]=0 //根结点
while(top>0)//有根结点
{
p=stack[top] //取根结点指针
n=level[top] //取显示空格的个数
for(i=1i<=ni++)//显示空格(缩进)
printf(" ")
if(flag[top]==0) //若是根结点
printf("T:%c\n",p->data)//显示根结点
else //不是根结点
{
if(flag[top]==2) //是右子树根结点
printf("R:%c\n",p->data)//显示右子树根结点
if(flag[top]==1) //是左子树根结点
printf("L:%c\n",p->data,top)//显示左子树根结点
}
top-- //显示一个(出栈一个)结点,top-1
if(p->rchild!=NULL)//若有右孩子
{
top++ //保存一个根结点,top+1
stack[top]=p->rchild//保存右子树根结点
level[top]=n+3
flag[top]=2
}
if(p->lchild!=NULL)//若有左孩子
{
top++
stack[top]=p->lchild//保存左子树根结点
level[top]=n+3
flag[top]=1
}
// printf("level[top]=%d\n",level[top])
}
}
}
main()
{
BinNode *T //根结点的指针
T=creat() //建二叉树
printf("\n用缩进表示二叉树的层次(如ppt62所示):\n")
DisplayBinTree(T)
getch()
}
之所以跳过去了,是因为scanf自动附上‘\n’的值了,理论我也讲不清楚#include <stdio.h>
int main(i)
{
double moheight,faheight,height
char sex,diet,sport
printf("ENTER SEX\n")
scanf("%c",&sex)
printf("ENTER parents height\n")
scanf("%lf%lf",&moheight,&faheight)
if(sex=='m'||sex=='M')
//类似sex=='m'||'M',这样的写法是行不通的,帮你修改下
{
height=(faheight+moheight)*0.54
printf("%lf\n",height)
}
else if(sex=='f'||sex=='F')
{
height=(faheight*0.923 + moheight)/2
printf("%lf\n",height)
//这里也要输出的吧,不能搞性别歧视啊
}
printf("whether like sport\n")
fflush(stdin)
//关键点,加了这个清空缓存,程序就可以正常运行了
scanf("%c",&sport)
if(sport=='y'||sport=='Y')
{
height=height*1.02
printf("%lf\n",height)
}
else
printf("whether good diet\n")
fflush(stdin)
//关键点,加了这个清空缓存,程序就可以正常运行了
scanf("%c",&diet)
if(diet=='y'||diet=='Y')
{
height=height*1.015
}
else
printf("%lf\n",height)
system("PAUSE")
return 0
}