将结构指针向量对的值传递给函数

Posted

技术标签:

【中文标题】将结构指针向量对的值传递给函数【英文标题】:Passing value from vector pair of struct pointer to function 【发布时间】:2020-08-17 15:08:56 【问题描述】:

该代码是关于查找由边连接节点的树的直径。当我调用直径函数时,我遇到了问题。它编译没有错误,但是当我运行代码时,代码在调用直径函数后停止执行。

#include <bits/stdc++.h>
using namespace std;
struct Node 
    int data;
    struct Node* left,*right;
;

int height(struct Node* node)
    if(node==NULL) return 0;
    else return max(height(node->left),height(node->right))+1;

int diameter(struct Node* node)
    if(node==NULL)
       return 0;
    
    int left_height=height(node->left);
    int right_height=height(node->right);
    return max(left_height+right_height+1,max(diameter(node->left),diameter(node->right)));



int main()
    int n,t1,t2;
    cin>>n;
    vector<pair<int,int>>v;
    for(int i=1;i<n;i++)
        cin>>t1>>t2;
        v.push_back(t1,t2);
    
    vector<pair<struct Node*,struct Node*>>v2;
    for(int i=0;i<n-1;i++)
        struct Node* node1=new Node,*node2=new Node;
        node1->data=v[i].first; node2->data=v[i].second;
        node1->left=NULL; node2->right=NULL;
        node1->right=node2; node2->left=node1;
        v2.push_back(node1,node2);
        // v2[i].first=node1; v2[i].second=node2;
    
    cout<<"hei"<<endl;
    for(int i=0;i<(signed)v2.size();i++)
        cout<<v2[i].first->data<<" "<<v2[i].second->data<<endl;
    
    // return 0;
    int dia=0,maxdia=0;
    for(auto it : v2)
        dia=diameter(it.first);
        if(dia>maxdia) maxdia=dia;
        dia=diameter(it.second );
        if(dia>maxdia) maxdia=dia;
    
    cout<<endl;
    cout<<"anything"<<endl;

    cout<<maxdia<<endl;
    return 0;


/* inputs 
//Input1
3
3 2
2 1
//Input2
5
4 2
1 4
5 4
3 4

*/

直径功能通过手动输入可以正常工作


struct Node* NewNode(int data)
    struct Node* node=new Node();
    node->data=data;
    node->left=NULL; node->right=NULL;


int main()
    struct Node* root= NewNode(1);
    root->left=     NewNode(2);
    root->right=    NewNode(3);
    root->left->right=    NewNode(4);
    root->left->left=     NewNode(5);
    // root->right->left=    NewNode(6);
    root->left->left->right=    NewNode(7);
    root->left->right->right    =NewNode(8);
    root->left->right->right->left    =NewNode(9);
    root->left->right->right->left->right    =NewNode(10);
    cout<<diameter(root)<<endl;
    return 0;

【问题讨论】:

它编译没有错误,但是...... -- 编译没有错误只是意味着没有语法错误。该程序仍然可能有逻辑错误。这就是 调试 完成的地方。你对程序做了哪些调试? 我正在考虑将迭代节点作为根节点,以便找到树的最大直径。没有固定的根节点。 你的两个例子似乎使用了不同的树。 失败的测试输入是什么?此外,您应该获取代码并在您拥有的编译器上进行本地调试。调试自己的代码是学习如何编写程序的一部分。您不应该依赖网站和以前的答案 - 您应该获取代码,使用调试器逐步完成它,并亲自查看缺陷在哪里。然后,一旦您发现缺陷在哪里,您就可以自己修复它,或者向我们提供您在逻辑中发现的缺陷的详细信息并建议如何解决它。 那是你误会的地方。如果代码编译时没有错误或警告,这意味着没有错误/警告。这与您是否犯了逻辑错误无关。如果我让你编写一个程序来添加两个数字,而不是减去这些数字,程序将编译而不会出现任何错误。程序是否正确?没有。 【参考方案1】:

这个函数:

int height(struct Node* node)
    if(node==NULL) return 0;
    else return max(height(node->left),height(node->right))+1;

如果你在循环图上调用它会进入无限递归,像这样:

...
node1->right=node2; node2->left=node1;
...

【讨论】:

以上是关于将结构指针向量对的值传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥传递给函数的指针的值没有改变? [复制]

试图取消引用一个接口,该接口是一个指向后端结构对象的指针,以便我可以按值传递给函数

无法从构造函数中将数组值传递给向量

成员结构的值在作为指针传递给函数后丢失

如何将向量传递给函数参数(我需要指针吗?)

将指针向量传递给c ++中的函数[重复]