Pipe * findPipe(int keyNode, Pipe p[], int sz)
{
// int flag[100] = {0}; 每一次到调用新一次findPipe的时候,都会重新flag[100] = {0},导致无法到达flag[2] == 2
int flag[100];
int count = 0;
for (int i = 0; i < sz; i++)
{
cout << "new flag" << i << " " << flag[i] << endl;//debug use
if (flag[i] == 2)
{
i++;
}
if ( p[i].node1 == keyNode )
{
cout << i << endl;
count++;
flag[i]++;
cout << "flag" << i << " " << flag[i] << endl;//debug use
return findPipe(p[i].node2, p, sz);
}
else if ( p[i].node2 == keyNode )
{
cout << i << endl;
count++;
flag[i]++;//mark
cout << "flag" << i << " " << flag[i] << endl;//debug use
return findPipe(p[i].node1, p, sz);
}
}
if (count == 0)
{
return 0;
}
else
{
return p;
}
}
输出结果是
flag0 0
flag1 0
1
flag1 1
flag0 1
0
flag0 2
flag0 1
0
flag0 2
flag0 1
0
flag0 2
flag0 1
.........
我期望的效果是:
输入Pipe数组p, sz是数组的大小, keyNode是需要查找的值。增加一个flag[100]作为标记。当符合p[i].node1或者p[i].node2是要查找的keyNode值后,在flag[i]增加1作为标记。如果flag[i] = 2则要i++
问题是:每次return findPipe()后进入新的循环时,new flag 0 1
我认为的是flag[i]应该保留上一轮的值,可能加过是1,可能没加过是0. 但是现在完全不对。
下方是全部代码
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
struct Pipe
{
string GDid;
int node1;
int node2;
};
Pipe * findPipe(int, Pipe [], int);
void display(Pipe *, int);
Pipe * findPipe(int keyNode, Pipe p[], int sz)
{
int flag[100];
int count = 0;
for (int i = 0; i < sz; i++)
{
cout << "new flag" << i << " " << flag[i] << endl;
if (flag[i] == 2)
{
i++;
}
if ( p[i].node1 == keyNode )
{
cout << i << endl;
count++;
flag[i]++;
cout << "flag" << i << " " << flag[i] << endl;
return findPipe(p[i].node2, p, sz);
}
else if ( p[i].node2 == keyNode )
{
cout << i << endl;
count++;
flag[i]++;
cout << "flag" << i << " " << flag[i] << endl;
return findPipe(p[i].node1, p, sz);
}
}
if (count == 0)
{
return 0;
}
else
{
return p;
}
}
void display(Pipe *arr, int n)
{
for (int i = 0; i < n; i++)
{
cout << arr[i].node1 << " ";
cout << arr[i].node2 << " ";
}
}
int main()
{
Pipe GD10001 = {"GD10001", 29, 50};
Pipe GD20310 = {"GD20310", 29, 98};
Pipe GD70091 = {"GD70091", 98, 50};
Pipe GD30021 = {"GD30021", 50, 33};
Pipe GD45122 = {"GD45122", 98, 64};
Pipe GD27945 = {"GD27945", 33, 27};
Pipe GD94512 = {"GD94512", 27, 15};
Pipe GD87194 = {"GD87194", 33, 24};
Pipe GD70980 = {"GD70980", 15, 24};
Pipe GD65123 = {"GD65123", 64, 17};
Pipe GD28720 = {"GD28720", 17, 24};
Pipe GD23424 = {"GD23424", 24, 28};
Pipe GD86246 = {"GD86246", 17, 39};
Pipe GD67767 = {"GD67767", 39, 76};
Pipe GD88888 = {"GD88888", 76};
Pipe GD32223 = {"GD32223", 28};
Pipe GD123 = {"GD123", 12, 121};
Pipe GD456 = {"GD456", 121, 181};
Pipe GD789 = {"GD789", 181, 196};
Pipe Myarray[19] = {GD10001, GD20310, GD70091, GD30021, GD45122, GD27945, GD94512, GD87194, GD70980, GD65123, GD28720, GD23424, GD86246, GD67767, GD88888, GD32223, GD123, GD456, GD789};
int size = 19;
int target = 98;
Pipe *result = findPipe(target, Myarray, size);
display(result, size);
return 0;
}