#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;
}
樹的雙親表示法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.