#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;
}
树的双亲孩子表示法
最新推荐文章于 2021-09-06 07:00:55 发布