#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
//结点的数据域
typedef struct Element
{
int id;
char* name;
}node_ele;
//结点的结构
typedef struct PNode
{
node_ele element; //孩子数据域
node_ele parent; //双亲指针域
}tree_node;
typedef struct ATree
{
tree_node trees[MAX_SIZE]; //树组
int r, n; //根的位置r和结点数n
}Atree;
void InitNode(Atree* tree)
{
int child_id;
int parent_id;
printf("请输入树大小\n");
tree->r = 0; //树根位置
scanf("%d", &(tree->n)); //要初始化树的大小(结点数)
printf("请输入id,孩子名,以及双亲id和双亲名\n");
for (int i = 0; i < tree->n; i++)
{
char* child_name = (char*)malloc(sizeof(char) * 100);
char* parent = (char*)malloc(sizeof(char) * 100);
//孩子值赋值
scanf("%d", &child_id);
tree->trees[i].element.id = child_id;
scanf("%s", child_name); //孩子名
tree->trees[i].element.name = child_name;
//双亲值赋值
scanf("%d", &parent_id);
tree->trees[i].parent.id = parent_id; //赋值双亲id
scanf("%s", parent); //双亲名
tree->trees[i].parent.name = parent;
}
//根节点无双亲
tree->trees[0].parent.id = -1;
tree->trees[0].parent.name = NULL;
}
void FindeParent(Atree* tree)
{
int find_id;
printf("请输入你要查询的id,将显示其双亲: ");
scanf("%d", &find_id);
for (int i = 0; i < tree->n; i++)
{
if (tree->trees[i].element.id == find_id)
{
printf("id: %d name: %s 的双亲是 id: %d name: %s\n", tree->trees[i].element.id, tree->trees[i].element.name, tree->trees[i].parent.id, tree->trees[i].parent.name);
return;
}
}
printf("未查到该孩子的双亲");
return;
}
int main(void)
{
Atree tree;
InitNode(&tree);
printf("树的样子:\n");
printf("id name parent_id parent_name\n");
for (int i = 0; i < tree.n; i++)
{
printf("%d %s %d %s\n", tree.trees[i].element.id, tree.trees[i].element.name, tree.trees[i].parent.id, tree.trees[i].parent.name);
}
setbuf(stdin, NULL);
FindeParent(&tree);
system("pause");
return 0;
}
树的双亲表示法
最新推荐文章于 2024-04-15 08:23:55 发布