简述说明
其它实现方法:
1.树的双亲表示法(数组实现) -A
2.树的双亲表示法(数组实现) -B
3.树的双亲表示法(链表实现) -B
可以参考: 树的双亲表示法(数组实现) -A
- 采用链表实现树的双亲表示法(带头结点).
- 树结点: 数据域 & 双亲域 & id标识.
- 树结点的id标识按顺序记录.
- 修改数据域数据类型则需要修改部分代码使兼容.
- 树结点按层序序列存储.
- 当最大结点数(T->maxsize)为0时, 则不限制最大结点数.
存储结构
c语言实现代码
- main.c
#include <stdio.h>
#include <stdlib.h>
#include "ParentTree.h"
/*********************************/
#define STR_MAXSIZE 1024
#if _WIN32
#define CLEARSCREEN "cls"
#elif __linux__
#define CLEARSCREEN "clear"
#endif
/*********************************/
/*=============== 树的双亲存储结构函数测试列表 ===============*/
void PrintMenu(void);
void ClearStdin(void);
void Pause(void);
void InitTree_Test(PTree *T);
void CreateTree_Test(PTree *T);
void PrintTree_Test(const PTree *T);
void ClearTree_Test(PTree *T);
void DestroyTree_Test(PTree *T);
void TreeEmpty_Test(const PTree *T);
void TreeDegree_Test(const PTree *T);
void TreeDepth_Test(const PTree *T);
void RootValue_Test(const PTree *T);
void Value_Test(const PTree *T);
void Order_Test(const PTree *T);
void Assign_Data_Test(const PTree *T);
void Assign_Id_Test(const PTree *T);
void ChildValue_Data_Test(const PTree *T);
void ChildValue_Id_Test(const PTree *T);
void Sibling_Data_Test(const PTree *T);
void Sibling_Id_Test(const PTree *T);
void ChildCount_Data_Test(const PTree *T);
void ChildCount_Id_Test(const PTree *T);
void ChildSeat_Data_Test(const PTree *T);
void ChildSeat_Id_Test(const PTree *T);
void InsertChild_Data_Test(PTree *T);
void InsertChild_Id_Test(PTree *T);
void InsertTree_Data_Test(PTree *T);
void InsertTree_Id_Test(PTree *T);
void DeleteTree_Data_Test(PTree *T);
void DeleteTree_Id_Test(PTree *T);
/*====================================================*/
void PrintMenu(void) {
system(CLEARSCREEN);
puts("1.InitTree \n");
puts("2.CreateTree \n");
puts("3.PrintTree \n");
puts("4.ClearTree \n");
puts("5.DestroyTree \n");
puts("6.TreeEmpty \n");
puts("7.TreeDegree \n");
puts("8.TreeDepth \n");
puts("9.RootValue \n");
puts("10.Value \n");
puts("11.Order \n");
puts("12.Assign_Data \n");
puts("13.Assign_Id \n");
puts("14.ChildValue_Data \n");
puts("15.ChildValue_Id \n");
puts("16.Sibling_Data \n");
puts("17.Sibling_Id \n");
puts("18.ChildCount_Data \n");
puts("19.ChildCount_Id \n");
puts("20.ChildSeat_Data \n");
puts("21.ChildSeat_Id \n");
puts("22.InsertChild_Data \n");
puts("23.InsertChild_Id \n");
puts("24.InsertTree_Data \n");
puts("25.InsertTree_Id \n");
puts("26.DeleteTree_Data \n");
puts("27.DeleteTree_Id \n");
puts("0.Exit \n");
printf("Input: ");
}
void ClearStdin(void) {
char ch;
while(ch=getchar(), ch!='\n');
}
void Pause(void) {
puts("Press enter to continue.");
ClearStdin();
}
void InitTree_Test(PTree *T) {
system(CLEARSCREEN);
Size_T n;
printf("Input n: ");
scanf("%u", &n);
ClearStdin();
if(InitTree_P(T, n))
puts("Error. ");
else
puts("Ok. ");
Pause();
}
void CreateTree_Test(PTree *T) {
system(CLEARSCREEN);
TElemType_P ch, str[STR_MAXSIZE];
printf("Input str: ");
for(Size_T i=0; i<STR_MAXSIZE; i++) {
if(ch=getchar(), ch=='\n') {
str[i] = '\0';
break;
}
str[i] = ch;
}
str[STR_MAXSIZE-1] = '\0';
if(CreateTree_P(T, str))
puts("Error. ");
else
puts("Ok. ");
Pause();
}
void PrintTree_Test(const PTree *T) {
system(CLEARSCREEN);
PrintTree_P(T);
Pause();
}
void ClearTree_Test(PTree *T) {
ClearTree_P(T);
}
void DestroyTree_Test(PTree *T) {
DestroyTree_P(T);
}
void TreeEmpty_Test(const PTree *T) {
system(CLEARSCREEN);
if(TreeEmpty_P(T))
puts("The tree is empty. ");
else
puts("The tree is not empty. ");
Pause();
}
void TreeDegree_Test(const PTree *T) {
system(CLEARSCREEN);
printf("Degree: %u \n", TreeDegree_P(T));
Pause();
}
void TreeDepth_Test(const PTree *T) {
system(CLEARSCREEN);
printf("Depth: %u \n", TreeDepth_P(T));
Pause();
}
void RootValue_Test(const PTree *T) {
system(CLEARSCREEN);
printf("RootValue: %c \n", RootValue_P(T));
Pause();
}
void Value_Test(const PTree *T) {
system(CLEARSCREEN);
PTNode *p;
Size_T k;
printf("Input k: ");
scanf("%u", &k);
ClearStdin();
if(p = Value_P(T, k))
printf("T->nodes[%u] = %c \n", k, p->data);
else
printf("T->nodes[%u] = NULL \n", k);
Pause();
}
void Order_Test(const PTree *T) {
system(CLEARSCREEN);
TElemType_P ch;
printf("Input ch: ");
ch = getchar();
ClearStdin();
printf("T->nodes[%u] = %c \n", Order_P(T, ch), ch);
Pause();
}
void Assign_Data_Test(const PTree *T) {
system(CLEARSCREEN);
TElemType_P ch, value;
printf("Input ch & value: ");
scanf("%c %c", &ch, &value);
ClearStdin();
if(Assign_Data_P(T, ch, value))
puts("Error. ");
else
puts("Ok. ");
Pause();
}
void Assign_Id_Test(const PTree *T) {
system(CLEARSCREEN);
Id_P id;
TElemType_P value;
printf("Input id & value: ");
scanf