女青年与西西 2018-07-10 02:12 采纳率: 0%
浏览 579
已结题

关于数组查找,生成新数组的问题

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;
}

  • 写回答

3条回答 默认 最新

  • Fatal Error 2018-07-10 02:43
    关注

    你这个递归有问题。int flag[100] 作为递归的形参试试,你把它定义成方法参数,生命周期在return之后就结束了,作为参数传递进去,在递归结束前不会消亡。

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置