/*********************************************** 程序:树的存储-----双亲表示法 完成者:小单 完成时间:2013年5月20日 ***********************************************/ #include <stdio.h> #define MAX_TREE_SIZE 100 #define OK 1 #define TRUE 1 #define FALSE 0 typedef int TElemType; typedef int Status; typedef struct PTNode //结点结构 { TElemType data; int parent; //双亲位置域 }PTNode; typedef struct //树结构 { PTNode nodes[MAX_TREE_SIZE]; int n; //树的结点数 }PTree; Status InitialTree(PTree &T) //树的初始化 { T.n = 0; //置根的结点数为0 return OK; } Status CreateTree(PTree &T) { printf("请输入结点数:\n"); scanf("%d",&T.n); printf("按编号1-n依次输入结点数值及对应的双亲位置(根结点的双亲请用-1表示):\n"); for(int i = 0; i < T.n; ++i) { scanf("%d %d",&T.nodes[i].data, &T.nodes[i].parent); } return OK; } Status FindParentOfNode(PTree &T, TElemType node, TElemType &parent) { //求结点node的双亲 for(int i = 0; i < T.n; ++i) { if(T.nodes[i].data == node) { if(T.nodes[i].parent == -1) { return FALSE;//根结点无双亲 } else { parent = T.nodes[i].parent;//找到双亲,用parent带回 return TRUE; } } } return FALSE; //无此结点返回 } Status FindChildOfNode(PTree &T, TElemType node) { //求结点node的孩子 int count = 0; //记录孩子的个数 for(int i = 0; i < T.n; ++i) { if(T.nodes[i].data == node) { for(int j = i+1; j < T.n; ++j)//因为我们是按编号1-n的顺序存储的树,所以此时j没必要从0开始 { if(T.nodes[j].parent == i) { ++count; //找到一个孩子,孩子个数加1 printf("结点%d的第%d个孩子%d\n", node, count, T.nodes[j]); } } } } if(!count) { return FALSE;//未找到孩子 } printf("总共有%d个孩子\n",count); return TRUE; //找到孩子 } int main()//测试 { PTree T; InitialTree(T); CreateTree(T); TElemType parent; TElemType node; printf("请输入一个结点:\n"); scanf("%d",&node); if(FindParentOfNode(T,node,parent)) { printf("结点%d的双亲为:%d\n",node,parent); } printf("\n"); if(!FindChildOfNode(T,node)) { printf("\n结点%d没有孩子\n",node); } return 0; }