#include <stdio.h>
#define MaxSize 100
typedef struct
{
char data[MaxSize];
int length; //串长
} SqString;
// 顺序串基本运算的算法
void StrAssign(SqString &s, char cstr[]) //字符串常量赋给串s
{
int i;
for (i = 0; cstr[i] != '\0'; i++)
s.data[i] = cstr[i];
s.length = i;
}
void DestroyStr(SqString &s)
{
}
void StrCopy(SqString &s, SqString t) //串复制
{
int i;
for (i = 0; i < t.length; i++)
s.data[i] = t.data[i];
s.length = t.length;
}
bool StrEqual(SqString s, SqString t) //判串相等
{
bool same = true;
int i;
if (s.length != t.length) //长度不相等时返回0
same = false;
else
for (i = 0; i < s.length; i++)
if (s.data[i] != t.data[i]) //有一个对应字符不相同时返回0
{
same = false;
break;
}
return same;
}
int StrLength(SqString s) //求串长
{
return s.length;
}
SqString Concat(SqString s, SqString t) //串连接
{
SqString str;
int i;
str.length = s.length + t.length;
for (i = 0; i < s.length; i++) //将s.data[0..s.length-1]复制到str
str.data[i] = s.data[i];
for (i = 0; i < t.length; i++) //将t.data[0..t.length-1]复制到str
str.data[s.length + i] = t.data[i];
return str;
}
SqString SubStr(SqString s, int i, int j) //求子串
{
SqString str;
int k;
str.length = 0;
if (i <= 0 || i > s.length || j < 0 || i + j - 1 > s.length)
return str; //参数不正确时返回空串
for (k = i - 1; k < i + j - 1; k++) //将s.data[i..i+j]复制到str
str.data[k - i + 1] = s.data[k];
str.length = j;
return str;
}
SqString InsStr(SqString s1, int i, SqString s2) //插入串
{
int j;
SqString str;
str.length = 0;
if (i <= 0 || i > s1.length + 1) //参数不正确时返回空串
return str;
for (j = 0; j < i - 1; j++) //将s1.data[0..i-2]复制到str
str.data[j] = s1.data[j];
for (j = 0; j < s2.length; j++) //将s2.data[0..s2.length-1]复制到str
str.data[i + j - 1] = s2.data[j];
for (j = i - 1; j < s1.length; j++) //将s1.data[i-1..s1.length-1]复制到str
str.data[s2.length + j] = s1.data[j];
str.length = s1.length + s2.length;
return str;
}
SqString DelStr(SqString s, int i, int j) //串删去
{
int k;
SqString str;
str.length = 0;
if (i <= 0 || i > s.length || i + j > s.length + 1) //参数不正确时返回空串
return str;
for (k = 0; k < i - 1; k++) //将s.data[0..i-2]复制到str
str.data[k] = s.data[k];
for (k = i + j - 1; k < s.length; k++) //将s.data[i+j-1..s.length-1]复制到str
str.data[k - j] = s.data[k];
str.length = s.length - j;
return str;
}
SqString RepStr(SqString s, int i, int j, SqString t) //子串替换
{
int k;
SqString str;
str.length = 0;
if (i <= 0 || i > s.length || i + j - 1 > s.length) //参数不正确时返回空串
return str;
for (k = 0; k < i - 1; k++) //将s.data[0..i-2]复制到str
str.data[k] = s.data[k];
for (k = 0; k < t.length; k++) //将t.data[0..t.length-1]复制到str
str.data[i + k - 1] = t.data[k];
for (k = i + j - 1; k < s.length; k++) //将s.data[i+j-1..s.length-1]复制到str
str.data[t.length + k - j] = s.data[k];
str.length = s.length - j + t.length;
return str;
}
void DispStr(SqString s) //输出串s
{
int i;
if (s.length > 0)
{
for (i = 0; i < s.length; i++)
printf("%c", s.data[i]);
printf("\n");
}
}
typedef struct node
{
SqString Husband;
SqString Wife;
struct node *lchild; //指向左孩子节点
struct node *rchild; //指向右孩子节点
} BTNode;
// 查找某人(参数为父亲姓名或者母亲姓名)的孩子们
void findChildren55(BTNode *root, SqString name55) {
if (root == NULL) return;
if (StrEqual(root->Husband, name55) || StrEqual(root->Wife, name55)) {
if (root->lchild != NULL) {
printf("55: 孩子: ");
DispStr(root->lchild->Husband);
}
if (root->rchild != NULL) {
printf("55: 孩子: ");
DispStr(root->rchild->Husband);
}
return;
}
findChildren55(root->lchild, name55);
findChildren55(root->rchild, name55);
}
// 查找某人的所有祖先
void findAncestors55(BTNode *root, SqString name55, BTNode *ancestors[], int &count) {
if (root == NULL) return;
if ((root->lchild != NULL && StrEqual(root->lchild->Husband, name55)) || (root->rchild != NULL && StrEqual(root->rchild->Husband, name55))) {
ancestors[count++] = root;
return;
}
int tempCount = count;
findAncestors55(root->lchild, name55, ancestors, count);
if (tempCount != count) {
ancestors[count++] = root;
return;
}
findAncestors55(root->rchild, name55, ancestors, count);
if (tempCount != count) {
ancestors[count++] = root;
}
}
// 查找某人同代的所有兄弟姐妹
void findSiblings55(BTNode *root, SqString name55) {
if (root == NULL) return;
if (root->lchild != NULL && StrEqual(root->lchild->Husband, name55)) {
if (root->rchild != NULL) {
printf("55: 兄弟姐妹: ");
DispStr(root->rchild->Husband);
}
return;
}
if (root->rchild != NULL && StrEqual(root->rchild->Husband, name55)) {
if (root->lchild != NULL) {
printf("55: 兄弟姐妹: ");
DispStr(root->lchild->Husband);
}
return;
}
findSiblings55(root->lchild, name55);
findSiblings55(root->rchild, name55);
}
// 给某人添加孩子
void addChild55(BTNode *root, SqString parentName55, SqString childName55, SqString childWife55) {
if (root == NULL) return;
if (StrEqual(root->Husband, parentName55)) {
if (root->lchild == NULL) {
root->lchild = new BTNode;
StrCopy(root->lchild->Husband, childName55);
StrCopy(root->lchild->Wife, childWife55);
root->lchild->lchild = NULL;
root->lchild->rchild = NULL;
printf("55: 成功添加孩子: ");
DispStr(childName55);
} else if (root->rchild == NULL) {
root->rchild = new BTNode;
StrCopy(root->rchild->Husband, childName55);
StrCopy(root->rchild->Wife, childWife55);
root->rchild->lchild = NULL;
root->rchild->rchild = NULL;
printf("55: 成功添加孩子: ");
DispStr(childName55);
} else {
printf("55: 该家庭已有两个孩子,无法添加。\n");
}
return;
}
addChild55(root->lchild, parentName55, childName55, childWife55);
addChild55(root->rchild, parentName55, childName55, childWife55);
}
// 某单身人士结婚后添加妻子姓名
void addWife55(BTNode *root, SqString husbandName55, SqString wifeName55) {
if (root == NULL) return;
if (StrEqual(root->Husband, husbandName55)) {
if (root->Wife.length == 0) {
StrCopy(root->Wife, wifeName55);
printf("55: 成功添加妻子: ");
DispStr(wifeName55);
} else {
printf("55: 该男士已有妻子,无法添加。\n");
}
return;
}
addWife55(root->lchild, husbandName55, wifeName55);
addWife55(root->rchild, husbandName55, wifeName55);
}
// 从输入字符串构建二叉树
BTNode* buildTree(SqString str) {
if (str.length == 0) return NULL;
int i = 0;
while (i < str.length && str.data[i] != '(') i++;
SqString couple = SubStr(str, 1, i);
int j = 0;
while (j < couple.length && couple.data[j] != '/') j++;
BTNode *node = new BTNode;
StrCopy(node->Husband, SubStr(couple, 1, j));
StrCopy(node->Wife, SubStr(couple, j + 1, couple.length - j - 1));
if (i == str.length) {
node->lchild = NULL;
node->rchild = NULL;
} else {
int leftStart = i + 1;
int leftEnd = leftStart;
int count = 0;
while (leftEnd < str.length) {
if (str.data[leftEnd] == '(') count++;
if (str.data[leftEnd] == ')') count--;
if (count == 0 && str.data[leftEnd] == ',') break;
leftEnd++;
}
node->lchild = buildTree(SubStr(str, leftStart, leftEnd - leftStart));
node->rchild = buildTree(SubStr(str, leftEnd + 1, str.length - leftEnd - 2));
}
return node;
}
int main() {
char input[] = "苏序/史氏(苏涣/杨氏(苏不欺/蒲氏,苏不疑),苏洵/程氏(苏轼/王弗,苏辙/史氏))";
SqString inputStr;
StrAssign(inputStr, input);
BTNode *root = buildTree(inputStr);
// 测试查找孩子
SqString searchName;
StrAssign(searchName, "苏涣");
findChildren55(root, searchName);
// 测试查找祖先
BTNode *ancestors[100];
int count = 0;
StrAssign(searchName, "苏轼");
findAncestors55(root, searchName, ancestors, count);
printf("55: 祖先: \n");
for (int i = count - 1; i >= 0; i--) {
DispStr(ancestors[i]->Husband);
}
// 测试查找兄弟姐妹
StrAssign(searchName, "苏辙");
findSiblings55(root, searchName);
// 测试添加孩子
SqString childName;
SqString childWife;
StrAssign(searchName, "苏轼");
StrAssign(childName, "苏迈");
StrAssign(childWife, "某氏");
addChild55(root, searchName, childName, childWife);
// 测试添加妻子
SqString husbandName;
SqString wifeName;
StrAssign(husbandName, "苏不疑");
StrAssign(wifeName, "新妻子");
addWife55(root, husbandName, wifeName);
return 0;
}
最新发布