t=t->parent->parent->lchild;/* 当前结点等于其祖先的第一个孩子 */ while(t) /* 存在则继续查找 */ { if(strcmp(t->data,ch->parent->data)!=0)/* 不是同一结点 */ { if(t->lchild) /* 当前结点存在左孩子 */ { temp=t->lchild; while(temp) /* 遍历当前结点左孩子的右子树 */ { if(strcmp(temp->data,ch->data)!=0) { if(!flag) /* 第一次输入时先输出下句 */ printf(\的所有堂兄弟有:\ printf(\ \访问当前成员 */ flag=1; } temp=temp->rchild; /* 继续遍历右孩子 */ } } } t=t->rchild; /* 继续遍历右孩子 */ } printf(\ } if(!flag) /* 标志没有输出结点 */ printf(\无堂兄弟!\\n\}
/* 查找一个成员的所有孩子 */
void Children(TriTree *t) /* 遍历左孩子 */ { if(t->lchild) /* 当前结点存在左孩子 */ { printf(\的所有孩子有:\ t=t->lchild; /* 遍历当前成员左孩子的右子树 */ while(t) /* 不空 */ { printf(\ \访问当前成员 */ t=t->rchild; } printf(\ }
else printf(\无孩子!\\n\}
/* 中序遍历一棵树 */
void InOrder(TriTree *t) { if(t) /* 二叉树存在 */ { InOrder(t->lchild); /* 中序遍历左子树 */ printf(\ \访问成员 */ InOrder(t->rchild); /* 中序遍历右子树 */ } }
/* 查找一个成员的子孙后代 */
void Descendants(TriTree *t) /* 遍历左孩子 */ { if(t->lchild) /* 当前结点存在左孩子 */ { printf(\的所有子孙后代有:\ InOrder(t->lchild); /* 中序遍历当前结点的左右子树 */ printf(\ } else printf(\无后代!\\n\}
/* 主控函数 */
int main(int argc,char* argv[]) { DataType str[MAXNUM]=\ int i,j,flag,start=0,pos,tag1,tag2; TriTree *temp,*tree=NULL; while(1) { printf(\欢迎使用家族关系查询系统!\\n\ printf(\请输入与之匹配的函数和参数,如parent(C)\\n\ printf(\新建一个家庭关系: Create(familyname) printf(\打开一个家庭关系: Open(familyname) printf(\添加新成员的信息: Append() printf(\查找一个成员的祖先: Ancesstor(name) printf(\查找一个成员的祖先路径:AncesstorPath(name) printf(\确定一个成员是第几代: Generation(name) 参数为字符串 \\n\ 参数为字符串 \\n\ 无参数 \\n\参数为字符串 \\n\参数为字符串 \\n\参数为字符串 \\n\
printf(\查找一个成员的双亲: Parent(name) 参数为字符串 \\n\printf(\查找一个成员的兄弟: Brothers(name) 参数为字符串 \\n\printf(\查找一个成员的堂兄弟: Consin(name) 参数为字符串 \\n\printf(\查找一个成员的孩子: Children(name) 参数为字符串 \\n\printf(\查找一个成员的子孙后代:Descendants(name) 参数为字符串 \\n\printf(\退出系统: Exit() 无参数\\n? \gets(input); /* input数组存放输入的函数和参数 */ j=0,tag1=0,tag2=0;
for(i=0;i if(!tag1) /* 若没匹配到左括号,说明只有函数无参数*/ pos=i; /* 标记为数组末尾 */ input[pos]='\\0';/* 将标记位置为字符串结束 */ str[j]='\\0'; if(strcmp(input,\函数名匹配 */ flag=1; /* 用flag标记 */ else if(strcmp(input,\ flag=2; else if(strcmp(input,\ flag=3; else if(strcmp(input,\ flag=4; else if(strcmp(input,\ flag=5; else if(strcmp(input,\ flag=6; else if(strcmp(input,\ flag=7; else if(strcmp(input,\ flag=8; else if(strcmp(input,\ flag=9; else if(strcmp(input,\ flag=10; else if(strcmp(input,\ flag=11; else if(strcmp(input,\ flag=12; else /* 无匹配则重新输入 */ { printf(\无匹配的函数,请重新输入!\\n\ continue; } if(!(flag==1||flag==2||flag==12)&&start==0) { /* 如果第一次输入函数不是建立、打开或退出,则重新输入 */ printf(\请先建立或打开一个家族关系!\\n\ continue; } start=1; /* 标记不是第一次输入input */ if(flag>=4&&flag<=11) /* 函数需要字符串型参数name */ { temp=Search(tree,str);/* 若存在则返回结点 */ if(!temp) /* 若不存在则返回 */ { printf(\该成员不存在!\\n\ continue; } } switch(flag) /* 根据flag标记调用函数 */ { case 1: tree=Create(str); break; case 2: tree=Open(str); break; case 3: Append(tree); break; case 4: Ancesstor(tree); break; case 5: AncesstorPath(temp); break; case 6: Parent(temp); break; case 7: Generation(temp); break; case 8: Brothers(temp,str); break; case 9: Consin(temp); break; case 10: Children(temp); break; case 11: Descendants(temp); break; case 12: exit(OK); } } return 0; } 二、地铁建设问题 /* 最小生成树.c */ #include \#define MAXVEX 30 #define MAXNAME 20/*顶点信息长度最大值*/ #define MAX 32767/*若顶点间无路径则以此最大值表示不通*/ typedef char VexType[MAXNAME];/*顶点信息*/ typedef float AdjType;/*两顶点间的权值信息*/ typedef struct/*边结构体*/ { int start_vex, stop_vex; /* 边的起点和终点 */ AdjType weight; /* 边的权 */ } Edge; typedef struct/*图结构*/ { int vexNum; /* 图的顶点个数 */