#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAX_SIZE 100
typedef struct childNode
{
int child_id;
struct childNode* next;
}cNode;
typedef struct headNode
{
int head_id;
cNode* firstPtr;
int parent_id;
}hNode;
typedef struct Tree
{
hNode headArray[MAX_SIZE];
int r, n;
}myTree;
cNode* phead = NULL;
cNode* ptail = NULL;
void InitFirstNode()
{
phead = (cNode*)malloc(sizeof(cNode));
phead->child_id = 0;
phead->next = NULL;
}
void InitTree(myTree* mytree)
{
mytree->r = -1;
printf("請輸入結點個數:");
scanf("%d", &mytree->n);
for (int i = 0; i < mytree->n; i++)
{
printf("請輸入第%d個結點編號:", i+1);
scanf("%d", &mytree->headArray[i].head_id);
printf("請輸入第%d個結點的雙親id:", i + 1);
scanf("%d", &mytree->headArray[i].parent_id);
//爲指針分配空間
mytree->headArray[i].firstPtr = (cNode*)malloc(sizeof(cNode));
mytree->headArray[i].firstPtr->next = NULL;
printf("請輸入當前第%d個結點共有多少個子結點:", i+1);
int nums = 0;
scanf("%d", &nums);
if (nums)
{
ptail = mytree->headArray[i].firstPtr;
for (int i = 0; i < nums; i++)
{
cNode* new_node = (cNode*)malloc(sizeof(cNode));
new_node->next = NULL;
printf("請輸入第%d個子結點的id: ", i + 1);
scanf("%d", &new_node->child_id);
ptail->next = new_node;
ptail = new_node;
}
}
}
}
void findNodeAllKids(myTree* mytree, int id)
{
int flag = 0;
for (int i = 0; i < mytree->n; i++)
{
if (mytree->headArray[i].head_id == id && mytree->headArray[i].firstPtr != NULL)
{
flag = 1;
cNode* ptmp = mytree->headArray[i].firstPtr->next;
while (ptmp != NULL)
{
printf("第%d個子結點id爲:%d\n", i+1, ptmp->child_id);
ptmp = ptmp->next;
}
}
}
if (!flag)
{
printf("木得子結點");
}
}
void findParent(myTree* mytree, int id)
{
for (int i = 0; i < mytree->n; i++)
{
if (mytree->headArray[i].head_id == id && mytree->headArray[i].parent_id != -1)
{
printf("雙親結點id爲:%d\n", mytree->headArray[i].parent_id);
}
}
}
int main(void)
{
myTree mytree;
InitFirstNode();
InitTree(&mytree);
findNodeAllKids(&mytree, 1);
findParent(&mytree, 2);
system("pause");
return 0;
}
樹的雙親孩子表示法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.