代码:
#include<iostream>
#include<string>
using namespace std;
struct tag {
char * name;
char * id;
int line;
int level;
tag * father;
};
int main() {
int n = 0;
int m = 0;
cin >> n >> m;
char * nouse = new char[80];
cin.getline(nouse, 80);
char ** doc = new char*[n];
for (int i = 0; i < n; i++)
doc[i] = new char[80];
for (int i = 0; i < n; i++)
for (int j = 0; j < 80; j++)
doc[i][j] = '\0';
for (int i = 0; i < n; i++) {
cin.getline(doc[i], 80);
}
char ** selector = new char*[m];
for (int i = 0; i < m; i++)
selector[i] = new char[80];
for (int i = 0; i < m; i++)
for (int j = 0; j < 80; j++)
selector[i][j] = '\0';
for (int i = 0; i < m; i++) {
cin.getline(selector[i], 80);
}
tag ** docs = new tag*[n];
for (int i = 0; i < n; i++) {
docs[i] = new tag();
int point = 0;//记录点的个数,可推算标签的级别
int x = 0;
int j = 0;
char * temp = new char[80];
while (doc[i][j] == '.') {
point++;
j++;
}
while (doc[i][j] != '\0') {
temp[x++] = doc[i][j];
j++;
}
temp[x] = '\0';
j = 0;
char * name = new char[80];//保存标签名
int a = 0;
char * id = new char[80];//保存标签id
int b = 0;
bool hasId = false;//用于记录该标签是否具有id属性
//判断该结构化文档是否具有id属性
for (j = 0; temp[j] != '\0'; j++) {
if (temp[j] == '#') {
hasId = true;
break;
}
}
x = 0;
if (hasId==true) {
//如果有id属性,则需要把id和标签名分别存储,两者以空格分隔
while (temp[x] != ' ') {
name[a++] = temp[x];
x++;
}
name[a] = '\0';
x = x + 2;
while (temp[x] != '\0') {
id[b++] = temp[x];
x++;
}
id[b] = '\0';
docs[i]->id = id;
}
else {
//如果没有id,则整个都是标签名
while (temp[x] != '\0') {
name[a++] = temp[x++];
}
name[a] = '\0';
docs[i]->id = NULL;
}
docs[i]->line = i + 1;
docs[i]->level = point / 2;
docs[i]->name = name;
}
//找到每个结点的父结点
docs[0]->father = NULL;
for (int i = 1; i < n; i++) {
for (int j = i-1; j >= 0; j--) {
if (docs[j]->level == docs[i]->level - 1) {
docs[i]->father = docs[j];
break;
}
}
}
//处理选择器
for (int i = 0; i < m; i++) {
int count = 0;//记录个数
int * result = new int[100];//记录行数
int b = 0;
int x=0;
//判断选择器的类型
if (selector[i][0] == '#') {
//是id选择器
char * id = new char[80];
int a = 0;
x = 1;
while (selector[i][x] != '\0') {
id[a++] = selector[i][x++];
}
id[a] = '\0';
for (int j = 0; j < n; j++)
{
if (docs[j]->id != NULL) {
if (strcmp(docs[j]->id, id) == 0) {
result[b] = docs[j]->line;
b++;
count++;
}
}
}
}
else {
//判断该选择器有多少层
int blank = 0;
for (int j = 0; selector[i][j] != '\0'; j++) {
if (selector[i][j] == ' ')
blank++;
}
char ** tags = new char*[blank + 1];
x = 0;
for (int j = 0; j < blank + 1; j++) {
tags[j] = new char[80];
int a = 0;
while (selector[i][x] != ' '&&selector[i][x]!='\0') {
tags[j][a] = selector[i][x];
a++;
x++;
}
tags[j][a] = '\0';
x++;
}
int k = blank;
b = 0;
int z = 0;
for (int j = 0; j < n; j++) {
if (strcmp(tags[blank],docs[j]->name)==0) {
if (blank == 0) {
count++;
result[b++] = docs[j]->line;
}
else {
tag * temp = docs[j]->father;
for (k = blank - 1; k >= 0; k--) {
if (strcmp(temp->name,tags[k])==0) {
temp = temp->father;
}
else
break;
}
if (k==-1) {
count++;
result[b++] = docs[j]->line;
}
}
}
}
}if (count == 0)
cout << count << endl;
else {
cout << count<<" ";
if (count >= 1) {
for (int j = 0; j < count - 1; j++) {
cout << result[j] << " ";
}
cout << result[count - 1] << endl;
}
}
}
return 0;
}
程序还是有问题…在OJ上总是编译错误,但是在vs上是没问题的。不知道哪里有问题??!