您的位置:首页 > 理论基础 > 数据结构算法

《数据结构学习与实验指导》4-5:家谱处理

2017-06-26 22:06 375 查看
输入说明:输入第1行给出2个正整数N(2<=N<=100)和M(M<=100),其中N为家谱中名字的数量,M伟家谱中陈述句的数量。接下来输入的每行不超过70个字符。名字的字符串有不超过10个英文字母组成。在家谱中的第一行给出的名字前没有缩进空格。家谱中的其他名字至少缩进2个空格,即他们是家谱中最早祖先的后代,且如果家谱中一个名字前缩进K个空格,则下一行中空格名字至多缩进k+2个空格。一个家谱中同样的名字不会出现两次,且家谱中没有出现的名字不会出现在陈述句中。

陈述句格式如下:

X is a child of Y

X is the parent of Y

X is a sibling of Y

X is a descendant of Y

X is an ancestor of Y

输出说明:对于测试用例中的每句陈述句,如果陈述为真,在一行中输出True;如果陈述为假,在一行中输出False。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MaxN 101
#define MaxName 11
#define MaxSentence 71

typedef struct Node {
char name[MaxName];
int level;
int parent;
} *PNode;

typedef struct Tree{
struct Node array[MaxN];
int size;
} *PTree;

int N, M;

PTree init();
void input(PTree tree, char name[], int level);
int find(PTree tree, char n[]);
void check(PTree tree, char n1[], char n2[], int relation);

int main() {
scanf("%d %d\n", &N, &M);
PTree tree = init();
int i;
for (i = 1; i <= N; i++) {
char c[MaxName];
gets(c);
int j = 0;
while (c[j] == ' ') {
j++;
}
input(tree, c + j, j / 2);
}
for (i = 1; i <= M; i++) {
char c[MaxSentence];
gets(c);
char n1[MaxName], n2[MaxName];
int relation = 0;
char *x = strstr(c, " is");
strncpy(n1, c, x - c);
n1[x - c] = '\0';
x = strstr(c, "of");
strncpy(n2, x + 3, strlen(c) - (x + 3 - c));
n2[strlen(c) - (x + 3 - c)] = '\0';
if (strstr(c, "child") - c > 0) {
relation = 1;
} else if (strstr(c, "parent") - c > 0) {
relation = 2;
} else if (strstr(c, "sibling") - c > 0) {
relation = 3;
} else if (strstr(c, "descendant") - c > 0) {
relation = 4;
} else if (strstr(c, "ancestor") - c > 0) {
relation = 5;
}
check(tree, n1, n2, relation);
}
return 0;
}

PTree init() {
PTree tree = (PTree) malloc(sizeof(struct Tree));
tree->size = 0;
int i;
for (i = 1; i <= N; i++) {
tree->array[i].level = 0;
tree->array[i].parent = i;
}
return tree;
}

void input(PTree tree, char name[], int level) {
int curIndex = tree->size;
tree->size++;
PNode node = tree->array + tree->size;
strcpy(node->name, name);
node->level = level;
int parent = curIndex;
if (tree->size != 1) {
while (tree->array[parent].level >= level) {
parent = tree->array[parent].parent;
}
}
node->parent = parent;
}

int find(PTree tree, char n[]) {
if (tree->size == 0) {
return -1;
}
int i;
for (i = 1; i < tree->size; i++) {
if (strcmp(n, tree->array[i].name) == 0) {
break;
}
}
return i;
}

void check(PTree tree, char n1[], char n2[], int relation) {
int flag = 0;
int i1 = find(tree, n1);
int i2 = find(tree, n2);
switch (relation) {
case 1:
if (tree->array[i1].parent == i2) {
flag = 1;
}
break;
case 2:
if (tree->array[i2].parent == i1) {
flag = 1;
}
break;
case 3:
if (tree->array[i1].parent == tree->array[i2].parent) {
flag = 1;
}
break;
case 4:
while (i1 != 0 && i1 != i2) {
i1 = tree->array[i1].parent;
}
if (i1 != 0 && i1 == i2) {
flag = 1;
}
break;
case 5:
while (i2 != 0 && i2 != i1) {
i2 = tree->array[i2].parent;
}
if (i2 != 0 && i2 == i1) {
flag = 1;
}
}
if (flag) {
printf("True\n");
} else {
printf("False\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构