1、双亲存储
// 结构体的定义
# define MAX 100
typedef struct {
dataType data[MAX];
int parent[MAX];
int length;
}Tree;
//开内存
Tree *tree = (Tree*)malloc(sizeof(Tree));
// 存储数据
tree -> data[0] = 'A';
tree -> parent[0] = -1;
tree -> length ++;
// 找C的父亲
while(tree->data[i] != 'C' && i < tree->length) //循环遍历找到C的存储位置
i ++;
int j = i; //临时存储
if(i < tree->length) // 判断i是否合法
i = tree->parent[i]; //如果合法的话将其父母的位置赋给i
printf("%c的父亲为:%c",tree->data[j],tree->data[i]);
2、孩子链表存储
// 孩子链表存储
#include<iostream>
// 结构体定义
# define MAX 100
typedef struct node
{
char adjvexpos;
struct node* next;
}Enode;
typedef struct
{
char data;
Enode* firstarc;
}Vnode; //每个数据元素
typedef struct
{
Vnode* list;
int length;
}Tree;
//树的初始化
Tree* tree;
// 建立树
void CreatTree()
{
char x;
printf("请输入结点个数:\n");
scanf("%d",&tree->length);
// 存储
// getchar();
for (int j = 0; j < tree->length; j++)
{
printf("请你输入第%d个结点\n", j);
scanf("%c", &x);
// getchar();
// 为什么要加一个getchar
tree->list[j].data = x;
tree->list[j].firstarc = NULL;
}
// 显示结点位置
for (int j = 0; j < tree->length; j++)
{
printf("结点元素 结点位置\n");
printf(" %c %c\n", tree->list[j].data, tree->list[j].firstarc);
}
printf("参考以上列表,建立结点关系\n");
for (int j = 0; j < tree->length; j++)
{
int pos;
printf("请输入%c后继结点的位置(以-1结束)\n", tree->list[j].data);
scanf("%d", &pos);
// getchar();
while (pos != -1)
{
Enode* P = (Enode*)malloc(sizeof(Enode));
P->adjvexpos = pos; // 存储 头插法
P->next = tree->list[j].firstarc;
tree->list[j].firstarc = P;
scanf("%d", &pos);
// getchar();
}
}
}
// 查找后继结点
void poster()
{
// 显示结点位置
for (int j = 0; j < tree->length; j++)
{
printf("结点元素 结点位置\n");
printf(" %c %c\n", tree->list[j].data, tree->list[j].firstarc);
}
printf("请你输入一个结点序号,我们将会显示它的后继结点\n");
int pos;
scanf("%d", &pos);
// getchar();
Enode* P;
P = tree->list[pos].firstarc;
printf("结点%c的后继如下\n", tree->list[pos].data);
// 链表的遍历
while (P != NULL)
{
printf("%c\n", tree->list[P->adjvexpos].data);
P = P->next;
}
}
// 展示树
void show()
{
printf("你输入的树如下:\n");
for (int j = 0; j < tree->length; j++)
{
Enode* P;
P = tree->list[j].firstarc;
printf("结点%c的后继如下:\n", tree->list[j].data);
while (P != NULL)
{
printf("%c,", P->adjvexpos);
P = P->next;
}
printf("\n");
}
}
// 界面
void menu()
{
int choose;
printf(" 请选择操作:\n 1、建立树\n 2、显示后继结点\n 3、退出\n");
scanf("%d", &choose);
switch (choose)
{
case 1:
CreatTree();
show();
menu();
break;
case 2:
poster();
menu();
break;
case 3:
exit(0);
break;
default:
printf("操作错误,请重新选择操作\n");
menu();
break;
}
}
int main()
{
tree = (Tree*)malloc(sizeof(Tree));
tree->list = (Vnode*)malloc(sizeof(Vnode) * MAX);
menu();
return 0;
}
// getchar();是否需要添加,是根据调试的实际情况决定的