树的孩子表示方法(部分完成)

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define OK    1
  4 #define NO    0
  5 #define TRUE  1
  6 #define FALSE 0
  7 #define ERROR -1
  8 
  9 #define MAX_TREE_SIZE 100  //树的最大结点数
 10  
 11 typedef int Status;
 12 typedef char TElemType_C;
 13 typedef struct CTNode  //孩子结点
 14 {
 15     int child;
 16     struct CTNode *next;
 17 }CTNode;
 18 typedef CTNode* ChildPtr;//孩子结点指针
 19 typedef struct
 20 {
 21     int parent;//双亲结点的位置
 22     TElemType_C data;
 23     ChildPtr firstchild;//孩子链表头指针
 24 
 25 }CTBox;
 26 typedef struct
 27 {
 28     CTBox nodes[MAX_TREE_SIZE];
 29     int r;//根的位置
 30     int n;//树的结点数
 31 }CTree;
 32 
 33 void InitTree_C(CTree *T);//构造空树
 34 
 35 void FreeChild_C(ChildPtr *p);//删除孩子列表
 36 
 37 void ClearTree_C(CTree *T);//清空树T
 38 
 39 void DestroyTree_C(CTree *T);//销毁树T
 40 
 41 Status TreeEmpty_C(CTree T);//判断树是否为空
 42 
 43 Status CreateTree_C(CTree *T);//按层序序列构造树
 44 
 45 int TreeDegree_C(CTree T);//返回树的度
 46 
 47 int TreeDepth_C_1(CTree T);//借助双亲标志
 48 
 49 int TreeDepth_C_1(CTree T);//不借助双亲标志
 50 
 51 int Depth_C(CTree T,int i);//求T中第i个结点开始的深度
 52 
 53 TElemType_C Root_C(CTree T);//返回树的根节点的值
 54 
 55 TElemType_C Value_C(CTree T,int i);//返回树中第i个结点值(按层序计数)
 56 
 57 int Order_C(CTree T,TElemType_C e);//返回结点e的值位置(在数组中的位置),-1代表无此结点
 58 
 59 Status Assign_C(CTree*T,TElemType_C e,TElemType_C value);//替换结点e的值为value
 60 
 61 TElemType_C ChildValue_C(CTree T,TElemType_C e,int order);//返回结点e的第order个孩子的值(从左到右计数)
 62 
 63 TElemType_C Sibling_C_1(CTree T,TElemType_C e,int mark);//返回元素e的左右兄弟,mark标记左右
 64 
 65 int Sibling_C_2(CTree T,TElemType_C e,int mark);//返回元素e的左右兄弟序号,mark标记左右
 66 
 67 int ChildCount_C(CTree T,TElemType_C p);//返回结点p的孩子结点(子树)个数,返回负数代表结点p不存在
 68 
 69 int ChildSeat_C(CTree T,TElemType_C p,int i);//返回树T中p结点的第i个孩子(层序计数)的位置,i=0定义为最后一个孩子。
 70 
 71 ChildPtr SiblingSeat_C(CTree T,TElemType_C p);//返回在孩子链表中指向元素p的指针。
 72 
 73 Status InsertChild_C(CTree *T,TElemType_C p,int i,TElemType_C e);//将结点e插入为p结点的第i个孩子(层序计数),i=0定义为最后一个孩子
 74 
 75 Status InsertTree_C(CTree *T,TElemType_C p,int i,CTree e);//将树t插入为树T中p结点的第i颗子树,i=0定义为最后一棵树
 76 
 77 Status DeleteTree_C(CTree *T,TElemType_C p,int i);//删除树T中p结点的第i棵子树
 78 
 79 void LevelOrderTraverse_C(CTree T);//层序遍历
 80 
 81 void Print_C_1(CTree T);//依赖双亲结点信息打印树。
 82 
 83 void ShowTree_C(CTree T);//展示T的存储结构
 84 
 85 
 86 int main (int argc,char** argv){
 87     CTree T,T0;
 88     printf("1\n函数InitTree_C测试..\n");
 89     {
 90         printf("初始化一棵空树 T..\n");
 91         InitTree_C(&T);
 92         printf("\n");
 93     }
 94     printf("5\n函数TreeEmpty_C测试..\n");
 95     {
 96         TreeEmpty_C(T)?printf("T 为空!!"):printf("T 不为空!!");
 97         printf("\n");
 98     }
 99     printf("6\n函数CreateTree_C测试..\n");
100     {
101         CreateTree_C(&T);
102         printf("\n");
103     }
104     printf("22\n函数LevelOrderTraverse_C测试..\n");
105     {
106         printf("层序遍历树 T=");
107         LevelOrderTraverse_C(T);
108         printf("\n");
109     }
110 
111 
112 return 0;
113 }
114 void InitTree_C(CTree *T){
115     int i;
116 
117     printf("录入根节点的位置(非负数):\n");
118         scanf("%d",&i);
119     if(i<0||i>MAX_TREE_SIZE-1)
120     {
121         printf(" i 值错误!\n");
122         exit(ERROR);
123     }
124     T->r=i;
125     T->n=0;
126 
127 }
128 Status TreeEmpty_C(CTree T){
129     return (T.n?FALSE:TRUE);
130 
131 }
132 
133 Status CreateTree_C(CTree *T){   //去掉getchar什么的一起输入不容易出错
134     TElemType_C ch;
135     int i;//i标记当前结点的父结点的位置
136     int    j;//j标记当前结点的位置
137     int k;//k标记i结点的第一个孩子的位置
138     ChildPtr p,q;//q始终指向child的尾指针
139     printf("录入树的根节点-->");
140     getchar();//抵掉回车
141     scanf("%c",&ch);
142     printf("\n");
143     if(ch!='^')
144     {
145         i=T->r;
146         T->nodes[i].parent=-1;
147         T->nodes[i].data=ch;
148         T->nodes[i].firstchild=NULL;
149         T->n++;
150         
151         if(i!=0)//设置第二个结点的输入位置
152             j=0;
153         else 
154             j=1;
155         k=j;
156     }
157     getchar();
158     printf("输入结点\n");
159     scanf("%c",&ch);
160     while(ch!='#')
161     {
162         p=q=NULL;
163         while(1){
164         scanf("%c",&ch);
165         if(ch=='^')
166         break;        
167         else
168         {
169             T->nodes[j].parent=i;
170             T->nodes[j].data=ch;
171             T->nodes[j].firstchild=NULL;
172             T->n++;
173             
174             p=(ChildPtr)malloc(sizeof(CTNode));
175             if(!p)
176                 exit(ERROR);
177             p->child=j;
178             p->next=NULL;
179             if(T->nodes[i].firstchild==NULL)
180                 T->nodes[i].firstchild=p;
181 
182             else
183                 q->next=p;
184             q=p;    
185         }
186         if(j+1==T->r)
187             j=j+2;
188         else
189             j++;    
190         }
191         i=k;
192         if(j+1==T->r)
193             k=k+2;
194         else 
195             k++;
196         scanf("%c",&ch);
197     }
198     return OK;
199 }
200 
201 void LevelOrderTraverse_C(CTree T){
202     int i,count;
203     count=0;
204     if(T.n)
205     {
206         count++;
207         printf("%c",T.nodes[T.r].data);
208         if(T.r)
209             i=0;
210         else
211             i=1;
212         while(count<T.n)
213         {
214             if(i!=T.r)
215             {
216                 count++;
217                 printf("%c",T.nodes[i].data);
218             }
219             i++;
220             
221         }    
222     }
223 }

 输入示例 

参考http://www.cnblogs.com/kangjianwei101/p/5222014.html

 

posted @ 2017-10-19 22:39  accomplishment  阅读(1446)  评论(0编辑  收藏  举报