为什么当我从 root 重新初始化它时我的指针指向 null

如何解决为什么当我从 root 重新初始化它时我的指针指向 null

我会尽量保持简单。

基本上,我正在处理图形并为最小生成树编写 Kruskal 算法。我做了一类森林,每个森林节点包含一个链表,其头部代表图的一个顶点,前向连接节点包含主头部顶点所连接的顶点,下一个森林节点包含图的下一个顶点图,并且该森林节点中的链接列表包含特定顶点所连接的顶点。

到目前为止,我的代码是 400 行。我将分享一个包含问题的片段:

#include <iostream>
using namespace std;

class node
{
public:
    int data;
    node* right;
    node()
    {
        data = 0;
        right = NULL;
    }
    ~node()
    {
        cout << data << " node has been destroyed " << endl;
    }
};


class forest
{
public:
    node* vertices;
    int weight;
    forest* next;
    forest()
    {
        vertices = NULL;
        weight = 0;
        next = NULL;
    }
    ~forest()
    {
        cout << vertices->data << " vertice has been destroyed " << endl;
    }
};

class que
{
public:
    int root;
    int connected;
    int weight;
    int set_no;         // for checking of disjoint sets
    que* next;
    que()
    {
        root = 0;
        connected = 0;
        weight = 0;
        set_no = 0;
        next = NULL;
    }
    ~que()
    {
        cout << "edge with root " << root << " connected to " << connected << " has been dequed " << endl;

    }
};
que* priority_dq(que*& front)
{
    que* move = front;
    que* link = front;
    que* required = new que;
    required = move;
    while (move->next != NULL)
    {
        if (required->weight > move->next->weight)
        {
            link = move;
            required = move->next;
        }
        move = move->next;
    }
    if (link == front)
    {
        front = front->next;
        link->next = NULL;
    }
    else
    {
        link->next = required->next;
    }
    return required;
}

void make_spanning_tree(forest*& root,que*& front,int count)
{
    que* use;
    forest* sets = new forest; // we using forest here bcz the data structure of its members is according to the dynamically changing disjoint set structure we need 
    int set_no = 1;           // each forest node 's vertices will contain 1 set's members
    node* move = new node;
    forest* iterate;
    //forest* start ;
    for (int i = 0; i < count; i++)
    {
        iterate = sets;
        use = priority_dq(front);
        if (iterate->vertices->data == 0)
        {
            iterate->vertices->data = use->root;
            node* add = new node;
            add->data = use->connected;
            iterate->vertices->right = add;
        }
        else
        {
            int* r_count = new int[set_no],* c_count = new int[set_no];
            int new_r = 1,new_c = 1;
            for (int j = 0; j < set_no; j++)
            {
                r_count[j] = 0;
                c_count[j] = 0;
                move = iterate->vertices;
                while (move != NULL)
                {
                    if (use->root == move->data)
                    {
                        r_count[j] = 1;
                        new_r = 0;
                    }
                    if (use->connected == move->data)
                    {
                        c_count[j] = 1;
                        new_c = 0;
                    }
                    move = move->right;
                }
                iterate = iterate->next;
            }
        }
    }
    iterate = sets;
    while (iterate != NULL)
    {
        move = iterate->vertices;
        while (move != NULL)
        {
            cout << move->data << " ";
            move = move->right;
        }
        cout << endl;
        iterate = iterate->next;
    }
}
int main()
{
    forest* root = new forest;
    forest* temp = root;

    int a;
    cout << "enter the vertices for the graph and enter -1 to stop" << endl;
    cin >> a;
    while (a != -1)
    {
        temp = root;
        if (temp->vertices == NULL)
        {
            node* join = new node;
            join->data = a;
            temp->vertices = join;
        }
        else
        {
            while (temp->next != NULL)
            {
                temp = temp->next;
            }
            node* join = new node;
            join->data = a;
            forest* add = new forest;
            add->vertices = join;
            temp->next = add;
        }
        cin >> a;
    }
    que* front = new que;
    int count = 1,from,to;
    cout << "Now enter the edges(atleast 3) present in the graph and their respective weights.To stop enter -1 " << endl;
    cout << "what is the root of edge no " << count << " ? ";
    cin >> from;
    while (from != -1)
    {
        forest* check;
        check = root;
        int is_vertice = 0;
        while (check != NULL)
        {
            if (check->vertices->data == from)
            {
                is_vertice = 1;
            }
            check = check->next;
        }
        if (is_vertice == 0)
        {
            cout << "sorry vertice is not present in  graph,try an exsisting one " << endl;
        }
        else
        {
            cout << "\nwhat is it connected to ? ";
            cin >> to;
            while (to != -1)
            {
                check = root;
                is_vertice = 0;
                while (check != NULL)
                {
                    if (check->vertices->data == to)
                    {
                        is_vertice = 1;
                    }
                    check = check->next;
                }
                if (is_vertice == 0)
                {
                    cout << "sorry vertice is not present in  graph,try an exsisting one or enter -1 to stop" << endl;
                    cin >> to;
                }
                else
                {
                    if (front->root == 0)
                    {
                        front->root = from;
                        front->connected = to;
                        cout << "enter the weight of this edge" << endl;
                        cin >> to;
                        front->weight = to;
                        count++;
                        break;
                    }
                    else
                    {
                        que* add = new que;
                        add->root = from;
                        add->connected = to;
                        cout << "enter the weight of this edge" << endl;
                        cin >> to;
                        add->weight = to;
                        add->next = front;
                        front = add;
                        count++;
                        break;
                    }
                }
            }
        }
        cout << "enter next vertice root for edge no " << count << " or enter -1 to stop " << endl;
        cin >> from;

    }
    que* move = front;
    cout << "EDGES: " << endl;
    while (move != NULL)
    {
        cout << "from " << move->root << " to " << move->connected << ",weight: " << move->weight << endl;
        move = move->next;
    }
    move = priority_dq(front);
    cout <<endl<< "minimum weight edge" << endl;
    cout << endl << "from " << move->root << " to " << move->connected << ",weight: " << move->weight << endl << endl;
    move = front;
    cout << endl << "que afterwards" << endl;
    while (move != NULL)
    {
        cout << "from " << move->root << " to " << move->connected << ",weight: " << move->weight << endl;
        move = move->next;
    }
    cout << endl << "SETS:" << endl;
    make_spanning_tree(root,front,count);
}

这里要关注的主要问题是,在我的生成树函数中,第一个 for 检查中的第一个 if 循环(我正在阅读 iterate->vertice->data 的位置)告诉我iterate 包含与以下移动相同的空值。所以,这意味着我的第一次迭代通过使用第一个 if 没问题,然后在第二个循环迭代中,我的 else 部分被使用,其中 move 指向 null,现在在第三个(最有可能) 它说 iterate->vertices 具有与移动相同的值 null 。这没有任何意义,因为我用 iterate 重新初始化 sets,它是根或头,它永远不能为空,因为我没有删除我的主要对象,而且我希望每次都从头开始再次读取我的支票。

我不明白为什么它仍然指向上次迭代中的以下空值。

解决方法

我运行了你的程序,它在 iterate->vertices->data 的第一个 make_spanning_tree 中抛出异常,说 iterate->verticesnullptr

您说您使用 iterate 重新初始化 sets,它是根或头,但似乎 setsnew forest,它具有 {{1} } 作为 nullptr,而不是 root。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res