1. 编程题:定义树的孩子兄弟表示法的存储结构,并实现如下图树的存储,并在主函数中验证。(运行结果截图)
#include "stdio.h"
typedef char DataType ;
typedef struct Node{
DataType data;
struct Node *firstchild, *nextsibling;
}CSTypeNode, *CSTypeTree;
CSTypeNode *tp;
int flag=0;
void GetTree(CSTypeNode *t,char x){//根据结点x,输出其父节点与子结点
CSTypeNode *p;
if(t==NULL) return ;
if(flag==1) return ;
p=t->firstchild;
if(p!=NULL &&flag!=2){ //父结点已找到,就不用再找
do{//寻找其父结点
if(p->data==x){
flag=2;//设置父结点已找到标志
printf("此结点%c的父结点为%c\n",x,t->data);
break;
}
p=p->nextsibling;
}while(p!=NULL);
}
if(t->data==x){//找到此结点否
flag=1;//是,设置已找到标志
if(t==tp)
printf("此结点%c为根结点\n",x);
if(t->firstchild==NULL)
printf("此结点%c无子结点\n",x);
else {
printf("此结点%c的子结点为",x);
p=t->firstchild;
do{//循环获取其子结点
printf("%c ",p->data);
p=p->nextsibling;
}while(p!=NULL);
printf("\n");
}
}
GetTree(t->nextsibling,x);//递归寻找右子结点
GetTree(t->firstchild,x); //递归寻找左子结点
return ;
}
void Tree2Link(CSTypeNode *t,char x)
{
flag=0;
tp=t;
GetTree(t,x);
if(flag==0)
printf("无此结点%c数据\n",x);
printf("\n");
}
int main(int argc, char* argv[])
{ printf("学号姓名 树的孩子兄弟结点表示\n");
CSTypeNode ta,tb,tc,td,te,tf,tg,ti,th;
ta.data='A';tb.data='B';
tc.data='C';td.data='D';
te.data='E';tf.data='F';
tg.data='G';th.data='H';
ti.data='I';tj.data='J';
ta.firstchild=&tb;ta.nextsibling=NULL;
tb.firstchild=&td;tb.nextsibling=&tc;
tc.firstchild=&th;tc.nextsibling=NULL;
td.firstchild=NULL;td.nextsibling=&tg;
te.firstchild=NULL;te.nextsibling=&tf;
tf.firstchild=NULL;tf.nextsibling=&ti;
tg.firstchild=&te;tg.nextsibling=NULL;
th.firstchild=NULL;th.nextsibling=&tJ;
ti.firstchild=NULL;ti.nextsibling=NULL;
tj.firstchild=NULL;ti.nextsibling=NULL;
char c[20];
while(true){
printf("输入结点数据:");
scanf("%s",c);
if(c[0]=='0') break;
//if(c=='\n') continue;
Tree2Link(&ta,c[0]);
}
return 0;
}