孩子表示法存储普通树采用的是 顺序表+链表 的存储方式
其中链表带头节点
//
// Created by lzb-linux on 2021/3/18.
//
#include "iostream"
using namespace std;
#define TElemType char
//孩子位置的链表节点
typedef struct Childindex {
int index;
Childindex *next; //链表的后继指针
} ChildLink;
//树节点
typedef struct Node {
TElemType data;
ChildLink *first; //连接孩子节点位置链表的头指针
} Node;
//普通树
typedef struct CTree {
Node *CT;
int num;
} CTree;
//初始化
bool InitTree(CTree &CTree) {
int n;
printf("输入初始化容量:");
cin >> n;
CTree.CT = new Node[n];
for (int i = 0; i < n; i++) {
CTree.CT[i].data = '!';
CTree.CT[i].first = new ChildLink; //带头节点的链表
CTree.CT[i].first->next = NULL;
}
CTree.num = 0;
return true;
}
bool AddTreeNode(CTree &CTree) {
int n;
printf("请输入数量:");
cin >> n;
printf("输入字符:");
for (int i = 0; i < n; i++) {
cin >> CTree.CT[i].data;
CTree.num++;
}
for (int i = 0; i < n; i++) {
printf("%c [%d]\n", CTree.CT[i].data, i);
}
for (int i = 0; i < n; i++) {
printf("请输入节点%c的孩子节点位置:", CTree.CT[i].data);
ChildLink *pre = CTree.CT[i].first;
int index;
while (true) {
cin >> index;
if (index == -1) { //输入-1表示结束输入
break;
}
Childindex *Ci = new ChildLink;
Ci->index = index;
Ci->next = pre->next;
pre->next = Ci;
}
}
return true;
}
void ShowTree(CTree CTree) {
for (int i = 0; i < CTree.num; i++) {
printf("节点%c的孩子节点为", CTree.CT[i].data);
for (ChildLink *cur = CTree.CT[i].first->next; cur != NULL;
cur = cur->next) {
printf("%c ", CTree.CT[cur->index].data);
}
printf("\n");
}
}
bool FindNode(CTree CTree, TElemType c) {
for (int i = 0; i < CTree.num; i++) {
if (CTree.CT[i].data == c) {
printf("节点%c的孩子节点为", CTree.CT[i].data);
for (ChildLink *cur = CTree.CT[i].first->next; cur != NULL;
cur = cur->next) {
printf("%c ", CTree.CT[cur->index].data);
}
printf("\n");
return true;
}
}
return false;
}
void Find(CTree CTree) {
TElemType c;
printf("请输入需要查找的节点数据:");
cin >> c;
if (FindNode(CTree, c)) {
printf("未找到节点!\n");
}
}
void Meue() {
printf("1.添加节点数据\n");
printf("2.显示所有节点数据和孩子节点\n");
printf("3.查找节点\n");
}
int main() {
CTree CT;
int choice;
InitTree(CT);
while (true) {
Meue();
printf("输入序号:");
cin >> choice;
if (choice == 0) {
break;
}
switch (choice) {
case 1:
AddTreeNode(CT);
break;
case 2:
ShowTree(CT);
break;
case 3:
Find(CT);
break;
}
}
return 0;
}