数据结构C语言版-树的双亲表存储表示(共12页).doc
《数据结构C语言版-树的双亲表存储表示(共12页).doc》由会员分享,可在线阅读,更多相关《数据结构C语言版-树的双亲表存储表示(共12页).doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上/*数据结构C语言版 树的双亲表存储表示P135 编译环境:Dev-C+ 4.9.9.2日期:2011年2月13日 */#include typedef char TElemType;/ 树的双亲表存储表示 #define MAX_TREE_SIZE 100typedef structTElemType data;/数据域int parent;/ 双亲位置域 PTNode;/结点结构typedef structPTNode nodesMAX_TREE_SIZE;/存储结点的数组int n; / 结点数 PTree;typedef structint num;TElem
2、Type name;QElemType; / 定义队列元素类型 typedef struct QNodeQElemType data;/数据域struct QNode *next;/指针域QNode,*QueuePtr;typedef structQueuePtr front,/队头指针,指针域指向队头元素rear; /队尾指针,指向队尾元素LinkQueue;TElemType Nil= ; / 以空格符为空 int InitTree(PTree *T) / 操作结果: 构造空树T (*T).n=0;return 1;void DestroyTree() / 由于PTree是定长类型,无法销
3、毁 / 构造一个空队列Qint InitQueue(LinkQueue *Q) (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode);/动态分配一个空间if(!(*Q).front)exit(0);(*Q).front-next=NULL;/队头指针指向空,无数据域,这样构成了一个空队列return 1;/ 若Q为空队列,则返回1,否则返回0 int QueueEmpty(LinkQueue Q)if(Q.front=Q.rear)return 1;elsereturn 0;/ 插入元素e为Q的新的队尾元素int EnQueue(LinkQue
4、ue *Q,QElemType e) QueuePtr p=(QueuePtr)malloc(sizeof(QNode);if(!p) / 存储分配失败 exit(0);/生成一个以为e为数据域的队列元素p-data=e;p-next=NULL;/将该新队列元素接在队尾的后面(*Q).rear-next=p;(*Q).rear=p;return 1;/ 若队列不空,删除Q的队头元素,用e返回其值,并返回1,否则返回0 int DeQueue(LinkQueue *Q,QElemType *e)QueuePtr p;if(*Q).front=(*Q).rear)return 0;p=(*Q).f
5、ront-next;/队头元素*e=p-data;(*Q).front-next=p-next;if(*Q).rear=p)(*Q).rear=(*Q).front;free(p);return 1;/ 构造树T int CreateTree(PTree *T) LinkQueue q;QElemType p,qq;int i=1,j,l;char cMAX_TREE_SIZE; / 临时存放孩子结点数组 InitQueue(&q); / 初始化队列 printf(请输入根结点(字符型,空格为空): );scanf(%c%*c,&(*T).nodes0.data); / 根结点序号为0,%*c
6、吃掉回车符 if(*T).nodes0.data != Nil) / 非空树 (*T).nodes0.parent = -1; / 根结点无双亲 qq.name = (*T).nodes0.data;qq.num = 0;EnQueue(&q,qq); / 入队此结点 while(i MAX_TREE_SIZE & !QueueEmpty(q) / 数组未满且队不空 DeQueue(&q,&qq); / 出队一个结点 printf(请按长幼顺序输入结点%c的所有孩子: ,qq.name);gets(c);l=strlen(c);for(j=0;jMAX_TREE_SIZE)printf(结点数
7、超过数组容量n);exit(0);(*T).n=i;else(*T).n=0;return 1;#define ClearTree InitTree / 二者操作相同 / 若T为空树,则返回1,否则返回0int TreeEmpty(PTree T) if(T.n)return 0;elsereturn 1;/ 返回T的深度int TreeDepth(PTree T) int k,m,def,max=0;/存储深度for(k=0;kT.n;+k)def=1; / 初始化本际点的深度 m = T.nodesk.parent;while(m != -1)m = T.nodesm.parent;def
8、+;if(max def)max = def;return max; / 最大深度 / 返回T的根TElemType Root(PTree T) int i;for(i=0;iT.n;i+)if(T.nodesi.parent 0)return T.nodesi.data;return Nil;/ 返回第i个结点的值 TElemType Value(PTree T,int i)if(iT.n)return T.nodesi.data;elsereturn Nil;/ 改cur_e为valueint Assign(PTree *T,TElemType cur_e,TElemType value)
9、int j;for(j=0;j(*T).n;j+)if(*T).nodesj.data = cur_e)(*T).nodesj.data = value;return 1;return 0;/ 若cur_e是T的非根结点,则返回它的双亲,否则函数值为空TElemType Parent(PTree T,TElemType cur_e) int j;for(j=1; j T.n;j+) / 根结点序号为0 if(T.nodesj.data = cur_e)return T.nodesT.nodesj.parent.data;return Nil;/ 若cur_e是T的非叶子结点,则返回它的最左孩子
10、,否则返回空TElemType LeftChild(PTree T,TElemType cur_e) int i,j;for(i=0;iT.n;i+)if(T.nodesi.data = cur_e) / 找到cur_e,其序号为i break;for(j=i+1; j T.n;j+)/ 根据树的构造函数,孩子的序号其双亲的序号 / 根据树的构造函数,最左孩子(长子)的序号其它孩子的序号 if(T.nodesj.parent = i)return T.nodesj.data;return Nil;/ 若cur_e有右(下一个)兄弟,则返回它的右兄弟,否则返回空 TElemType RightS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 双亲 存储 表示 12
限制150内