双亲与孩子链表

  1 #include"stdio.h"
  2 #include"stdlib.h"
  3 #include"malloc.h"
  4
  5
  6 const int maxlen=1000;//线性表的最大长度
  7 typedef char type;
  8 //------------线性表------------------
  9 struct List
 10 {
 11     type Data[maxlen];//存放数据
 12     int CurNum;//当前线性表
 13 };
 14
 15 void Intialize( List &A)//线性表初始化
 16 {
 17     A.CurNum = 0;//线性表元素个数为0
 18 }
 19
 20 int Length(List &A)//求表长度的实现
 21 {
 22     return A.CurNum;
 23 }
 24
 25 void Insert(    List &A,const int i,const int x)//插入元素运算对应的函数
 26 {
 27     if(A.CurNum==maxlen)printf("溢出!\n");//溢出,不能插入
 28     if(i<1||i>Length(A)+1)printf("插入范围有错!\n");//插入范围有错
 29     else {
 30         for(int j=A.CurNum-1;j>=i-1;j--){
 31             A.Data[j+1]=A.Data[j];
 32         }
 33         A.Data[i-1]=x;
 34         A.CurNum++;
 35
 36     }
 37 }
 38 void  Get_int(List &A,const int i,int &x)//按序号取元素运算
 39 {
 40     if(i<=0||i>A.CurNum)printf("序号错误!\n");
 41     else {
 42         x=A.Data[i-1];
 43     }
 44 }
 45 //------------线性表------------------
 46
 47
 48 //-------------链表------------------
 49
 50 struct link_list
 51 {
 52     type data;
 53     link_list *next;
 54 };
 55
 56 /*创建链表*/
 57 link_list *Create_list(link_list *head)
 58 {
 59     head = (link_list *)malloc(sizeof link_list);
 60     if(head==NULL)
 61     {
 62         printf("setup fail\n");
 63
 64         exit(0);
 65     }
 66     head->data=NULL;
 67     head->next=NULL;
 68     return head;
 69 }
 70
 71 /*向链表中插入一个元素*/
 72 void Insert_list(link_list *head,type data)
 73 {
 74     link_list *q=NULL;
 75     link_list *p=NULL;
 76     link_list *s=NULL;
 77     q=head;
 78     p=q->next;
 79     while(p!=NULL)
 80     {
 81         q=p;
 82         p=q->next;
 83     }
 84     s=(link_list *)malloc(sizeof link_list);
 85     s->data = data;
 86     q->next=s;
 87     s->next=p;
 88 }
 89
 90 void browse(link_list *head)
 91 {
 92     link_list *q=NULL;
 93     q=head->next;
 94     while(q!=NULL)
 95     {
 96         printf("num:%c\n",q->data);
 97         q=q->next;
 98     }
 99 }
100
101
102 /*查找元素 并返回位置*/
103 link_list *find_list(link_list *head,int data)
104 {
105     link_list *q=NULL;
106     link_list *p=NULL;
107     q=head;
108     p=q->next;
109     while(p!=NULL&&p->data!=data)
110     {
111         q=p;
112         p=q->next;
113     }
114     printf("num :%c data : %c\n",p->data);
115     return p;
116 }
117
118 struct BNode
119 {
120     type info;
121     link_list *child;
122 };
123
124 char Allch[maxlen];
125 int numchar = 0;
126
127 BNode Tree[maxlen];
128 int num_tree = 0;
129 List node;
130 void  Create_Tree()
131 {
132     int i,j,select;//选择
133     char A,B;//结点A,B
134     int flags;
135     //char
136     A=‘ ‘;
137     B=‘ ‘;
138     select = 0;
139     Intialize(node);//初始化存放各个结点
140     printf("[--------树的建立---------]\n");
141     printf("输入几组数据:");
142     scanf("%d",&select);
143     char ch[maxlen];
144     printf("结点(node)\t父节点(parent)\n");
145     scanf("%s",&ch);
146     for(i=0;i<2*select;i++)
147     {
148         flags =1;
149         for(j=0;j<numchar;j++)
150         {
151             if(ch[i]==Allch[j])//该字符已经存在
152             {
153                 flags =0;
154                 break;
155             }
156         }
157         if(flags==1)//该字符不存在
158         {
159             Allch[numchar++]=ch[i];
160         }
161     }
162
163     for(i=1;i<2*select;i=i+2)
164     {
165         flags = 1;
166         for(j=0;j<=node.CurNum;j++)
167         {
168             if(node.Data[j]==ch[i])///结点原先存在
169             {
170                 flags = 0;
171                 break;
172             }
173         }
174         //printf("%d %c\n",flags,ch[i]);
175         if(flags==1)//结点不存在,添加
176         {
177             Insert(node,node.CurNum+1,ch[i]);
178         }
179
180         int pa = 0;//标识父节点是否存在
181         for(j=0;j<num_tree;j++)
182         {
183             if(Tree[j].info==ch[i])//父节点已经存在
184             {
185                 Insert_list(Tree[j].child,ch[i-1]);
186                 pa =1;
187                 break;
188             }
189         }
190         if(pa==0)//父节点尚未不存在
191         {
192             Tree[num_tree].info = ch[i];
193             Tree[num_tree].child = NULL;
194             Tree[num_tree].child=Create_list(Tree[num_tree].child);
195             Insert_list(Tree[num_tree].child,ch[i-1]);
196             num_tree++;
197         }
198     }
199
200     /*
201
202     for(i=0;i<=node.CurNum;i++)printf(" %c",node.Data[i]);
203     printf("\n");
204
205     for(i=0;i<num_tree;i++)
206     {
207         printf("  %c",Tree[i].info);
208         printf("孩子链表:");
209         browse(Tree[i].child);
210         printf("孩子链表:");
211     }
212     */
213 }
214
215 void Print_Tree()
216 {
217     int i,j,select;//选择
218     printf("      ------------------------------------\n");
219     printf("     |--------1:双亲表示法----------------|\n");
220     printf("     |--------0:复合链表法----------------|\n");
221     printf("      ------------------------------------\n");
222     printf("您的选择是:");
223     scanf("%d",&select);
224     while(select!=0&&select!=1)
225     {
226         printf("您输入有误,请重新输入:");
227         scanf("%d",&select);
228     }
229     if(select==1)
230     {
231         printf("---------双亲表示法----------\n");
232         printf("结点(node)\t父节点(parent)\n");
233         for(i=0;i<num_tree;i++)
234         {
235             link_list *q=NULL;
236             q=Tree[i].child->next;
237             while(q!=NULL)
238             {
239                 printf("%c\t%c\n",q->data,Tree[i].info);
240                 q=q->next;
241             }
242         }
243         printf("-------以上是双亲表示法--------\n");
244     }else{
245         printf("---------复合链表法------------\n");
246         printf("结点(node)\t父节点(parent)\n");
247         //printf("num%d]\n",numchar);
248         for(i=0;i<numchar;i++)
249         {
250             //printf("父:%c\n",node.Data[i]);
251             int flags = 1;
252             for(j=0;j<num_tree;j++)
253             {
254                 if(Tree[j].info==Allch[i])
255                 {
256                     flags = 0;
257                     printf("父节点:%c\t",Tree[j].info);
258                     printf("孩子节点:\t");
259                     link_list *q=NULL;
260                     q=Tree[j].child->next;
261                     while(q!=NULL)
262                     {
263                         printf("%c\t",q->data);
264                         q=q->next;
265                     }
266                     printf("\n");
267                     break;
268                 }
269             }
270             if(flags==1){//不存在子节点
271                 printf("父节点:%c\t",Allch[i]);
272                 printf("不存在孩子节点\n");
273             }
274         }
275         printf("-------以上是复合链表法----------\n");
276     }
277 }
278
279 char  boot()//找根节点(~)
280 {
281     int i;
282     char ch;
283     for(i=0;i<num_tree;i++)
284     {
285         if(Tree[i].info==‘~‘)//找根节点
286         {
287             link_list *q=NULL;
288             q=Tree[i].child->next;
289             if(q!=NULL)
290             {
291                 ch = q->data;
292             }
293             break;
294         }
295     }
296     return ch;
297 }
298 void preorder(char ch)//先序输出
299 {
300     printf("%c ",ch);
301     int i;
302     for(i=0;i<num_tree;i++)
303     {
304         if(Tree[i].info ==ch)
305         {
306
307             link_list *q=NULL;
308             q=Tree[i].child->next;
309             while(q!=NULL)
310             {
311                 preorder(q->data);
312                 q=q->next;
313             }
314             break;
315         }
316     }
317 }
318
319 void postorder(char ch)//后序输出
320 {
321     int i;
322     for(i=0;i<num_tree;i++)
323     {
324         if(Tree[i].info ==ch)
325         {
326             link_list *q=NULL;
327             q=Tree[i].child->next;
328             while(q!=NULL)
329             {
330                 postorder(q->data);
331                 q=q->next;
332             }
333             break;
334         }
335     }
336     printf("%c ",ch);
337 }
338
339 void layer(char ch)//后序输出
340 {
341     int i;
342     for(i=0;i<num_tree;i++)
343     {
344         if(Tree[i].info ==ch)
345         {
346             link_list *q=NULL;
347             link_list *s=NULL;
348             q=Tree[i].child->next;
349             s=Tree[i].child->next;
350             while(q!=NULL)
351             {   printf("%c ",q->data);
352                 q=q->next;
353             }
354             while(s!=NULL)
355             {
356                 layer(s->data);
357                 s=s->next;
358             }
359             break;
360         }
361     }
362     //printf("%c ",ch);
363 }
364
365 int Degree(char ch)//求一个字符的度数(入度+出度)
366 {
367     int i,count =0;
368     for(i=0;i<num_tree;i++)
369     {
370         if(Tree[i].info ==ch)
371         {
372             if(ch==‘~‘)count--;
373             link_list *q=NULL;
374             q=Tree[i].child->next;
375             while(q!=NULL)
376             {   count++;
377                 q=q->next;
378             }
379             break;
380         }
381     }
382     //if(ch!=‘~‘)count++;//根节点 的父节点不算
383     //count++;
384     return count;
385 }
386
387 void All_degree()//求所有结点的度以及度出现的而次数(去除根节点)
388 {
389     int i,j,max;
390     int a[maxlen];//存放所有结点的度
391     int b[maxlen][2];//存放结点度1,2,3...的个数
392     max = 0;
393     for(i=0;i<numchar;i++)//根节点的出度为1也算入(最终去除)
394     {
395         a[i] = Degree(Allch[i]);
396         if(max<a[i]) max=a[i];
397         //printf("%d ",a[i]);
398     }
399     for(i=0;i<=max;i++)
400     {
401         b[i][0] = i;
402         b[i][1] = 0;
403     }
404     for(i=0;i<numchar;i++)
405     {
406         for(j=0;j<=max;j++)
407         {
408             if(a[i]==b[j][0])b[j][1]++;
409         }
410     }
411     b[0][1]--;//去掉根节点的数目
412     printf("树中结点度的统计:\n");
413     for(i=0;i<=max;i++)
414     {
415         printf("度为%d的结点数目为:%d\n",b[i][0],b[i][1]);
416     }
417     printf("\n树中结点度的统计完成\n");
418 }
419 int  main()
420 {
421
422     int select,i=0;
423     Create_Tree();
424     char ch = boot();
425     do{
426         printf("      ------------------------------------\n");
427         printf("     |--------1:树的输出------------------|\n");
428         printf("     |--------2:树的先序遍历--------------|\n");
429         printf("     |--------3:树的后序遍历--------------|\n");
430         printf("     |--------4:树的层次输出--------------|\n");
431         printf("     |--------5:树中结点度统计------------|\n");
432         printf("      ------------------------------------\n");
433         printf("您的选择是:");
434         scanf("%d",&select);
435         while(select!=1&&select!=2&&select!=3&&select!=4&&select!=5)
436         {
437             printf("您输入有误,请重新输入:");
438             scanf("%d",&select);
439         }
440         switch(select)
441         {
442         case 0:
443
444         case 1:
445             Print_Tree();
446             break;
447         case 2:
448             printf("先序输出结果为:");
449             preorder(ch);
450             printf("\t先序输出完毕!\n\n");
451             break;
452         case 3:
453             printf("后序输出结果为:");
454             postorder( ch);
455             printf("\t后序输出完毕!\n\n");
456             break;
457         case 4:
458             printf("按层次输出结果为:");
459             printf("%c ",ch);
460             layer(ch);
461             printf("\t按层次输出完毕!\n\n");
462             break;
463         default:
464             All_degree();
465             break;
466         }
467         printf("\n");
468         printf("      ------------------------------------\n");
469         printf("     |--------1:继续操作------------------|\n");
470         printf("     |--------0:退出----------------------|\n");
471         printf("      ------------------------------------\n");
472         printf("您的选择是:");
473         scanf("%d",&select);
474     }while(select==1);
475     return 0;
476 }
时间: 2024-10-24 14:53:51

双亲与孩子链表的相关文章

树与二叉树(2)

[toc] 树的存储结构 树的存储结构有两种,线式存储 和 链式存储,灵活使用这两种存储结构,具有如下五种存储方式: 双亲表示法,一种顺序(线式)表示法 孩子表示法,一种链式表示法 孩子链表表示法,结合线式存储和链式存储的混合表示方式 带双亲的孩子链表表示法,结合线式存储和链式存储的混合表示方式 二叉链表(孩子 - 兄弟)存储表示法,一种链式存储方式 双亲表示法 这是一种顺序表示法,使用一维数组存储树中的节点,每个存储单元存储节点的值及其双亲节点在数组中的下标值.下面的树 T 使用双亲表示法存储

左耳听风 ARTS Week 002

要求:1.每周至少做一个 leetcode 的算法题 2.阅读并点评至少一篇英文技术文章 3.学习至少一个技术技巧 4.分享一篇有观点和思考的技术文章 1.每周至少做一个 leetcode 的算法题 算法题:20.有效括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认为是有效字符串. 示例 1: 输入: "()" 输出: true

树的定义与存储

树的定义 树(tree):n(n>=0)个节点的有限集T. n=0 则称为空树. 当n>0时,有且仅有一个特定的节点,称为树的根(root). 当n>1时,其余节点可分为m(m>=0)个互不相交的有限集T1,T2,..Tm,其中每一个和本身又是一棵树,称为跟的子树(subtree). ① ╱ │ ╲ ② ④ ③ 树与非树识别 除了根节点外,每个节点有且仅有一个父节点. 一个N个节点的树,共有N-1条边. 树的基本术语 结点(node)--表示树中的元素,包含数据元素及若干指向其子树

二叉树的二叉链表存储结构及C++实现

前言:存储二叉树的关键是如何表示结点之间的逻辑关系,也就是双亲和孩子之间的关系.在具体应用中,可能要求从任一结点能直接访问到它的孩子. 一.二叉链表 二叉树一般多采用二叉链表(binary linked list)存储,其基本思想是:令二叉树的每一个结点对应一个链表结点链表结点除了存放与二叉树结点有关的数据信息外,还要设置指示左右孩子的指针.二叉链表的结点结构如下图所示: 二叉树结点结构 lchild data rchild 其中,data为数据域,存放该结点的数据信息: lchild为左指针域

数据结构习题之树

                                   第六章 树 一.基本要求.重点.难点 本章目的是介绍二叉树的定义.性质.存储结构.遍历.树的定义.存储结构.遍历.树和森林与二叉树的转换,哈夫曼树等内容. 本章重点是掌握二叉树的遍历算法及有关应用.难点是使用本章所学到的有关知识设计出有效算法,解决与树或二叉树相关的应用问题. 二.考核目标.考核要求 1.树的概念,要求达到"理解"层次 1.1树的逻辑结构特征. 1.2树的不同表示方法. 1.3树的经常使用术语及含义.

数据结构学习笔记(树、二叉树)

树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 对于树的定义还需要强调两点:1.n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点.2.m>0时,子树的个数没有限制,但它们一定是互不相交的. 结点

遍历二叉树

二叉树顺序存储结构 二叉树的顺序存储结构就是用一维数组存储二义树中的结点并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系,左右兄弟的关系等. 顺序存储结构一般只用于完全二叉树. 将这棵二叉树存入到数组中,相应的下标对应其同样的位置: 二叉链表 typedef struct BiTNode /* 结点结构 */ { TElemType data; /*结点数据 */ struct BiTNode *lchild,*rchild; /* 左右孩子指针 */ }Bi

大话数据结构(十五)——二叉树的理论知识(2)

1 二叉树的存储结构 1.1 顺序存储结构 二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系. 一棵完全二叉树的存储: 一般二叉树存储:尽管层序编号不能反映逻辑关系,但是可以将其按完全二叉树编号,只不过把不存在的结点设置为"^". 极端情况,右斜树,这不建议使用 1.2 二叉链表 二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的,我们称这样的链表叫做二叉链表. lchil

树和二叉树-第6章-《数据结构题集》习题解析-严蔚敏吴伟民版

习题集解析部分 第6章 树和二叉树 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       相关测试数据下载  链接? 数据包       本习题文档的存放目录:数据结构\▼配套习题解析\▼06 树和二叉树