STL和元素插入中列表的动态分配

Dynamic allocation of list in STL and element insertion

本文关键字:列表 动态分配 插入 元素 STL      更新时间:2023-10-16

应该在图中读取以下代码,然后在相邻节点的动态分配列表中介绍一定数量的边缘。由于某种原因,该程序在read_graf()中调用add_edge()功能时停止,而IDE(又称CB)为stl_list打开了主文件。谁能指出问题?谢谢!

这是代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<list>
#define grafMAX 101
FILE *fin = fopen("grafin.txt","r");
FILE *fout = fopen("grafout.txt","w");
struct Graf{
    int nrV;
    std::list <int> *ad;
};
void init_graf(Graf g, int nr){
    g.nrV = nr;
    g.ad = new std::list <int> [g.nrV];//(std::list <int> *)malloc(g.nrV * sizeof(std::list <int>));
}
void add_edge(Graf g, int n1, int n2){
    g.ad[n1].push_back(n2);
    g.ad[n2].push_back(n1);
}
inline int min(const int a, const int b){
    if(a < b)
        return a;
    return b;
}
void read_graf(Graf g){
    int n,m;
    fscanf(fin,"%d%d",&n,&m);
    init_graf(g,n);
    while(m){
        int x,y;
        fscanf(fin,"%d%d",&x,&y);
        add_edge(g,x,y);
        --m;
    }
}

这是一个输入:

10 - # of nodes
11 - # of edges to be read
1 2
1 3
1 10
2 4
3 4
3 5
5 6
5 7
6 7
7 8
7 9

您是通过值将Graf传递给函数。这意味着更改都是您通过的参数的副本。原件没有变化。

如果您希望更改在功能之外可见,则应将其引用到Graf,例如void init_graf(Graf& g, int nr)

在我开始之前,这是两种C编码样式的奇怪组合,只有少量的C 扔进来访问列表类。这从来不是一个好主意。您的大部分代码都是用C编写的,因此您应该使用通过Malloc获得的C阵列。如果要使用C 列表类,则应使用C 类重写此程序,并包括文件和构造。

解决您的问题...

当您调用init_graf时,您将按值传递GRAF G,因此INIT_GRAF完成的任何初始化在init_graf返回时都会丢失。您需要通过C中的参考将其传递,以便您可以更新它。

稍后,当您调用add_edge时,g仍未实现,因此" AD"字段仍然不可原始化,因此G.AD [N1]会删除一个不好的指针,导致例外,您的程序将停止:

void add_edge(Graf g, int n1, int n2){
    g.ad[n1].push_back(n2);
    g.ad[n2].push_back(n1);

为了解决此问题,init_graf应该获得指向GRAF结构的指针,同样,add_edge也应获得G的指针。这是删除类列表(使其成为真正的C程序)的解决方案。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// #include<list>
#define grafMAX 101
FILE *fin = fopen("grafin.txt","r");
FILE *fout = fopen("grafout.txt","w");
struct Edge {
     int startNode;
     int endNode; 
};
struct Graf{
    int  nrV;      
    int  edgeCount; // Added to keep track of number allocated
    Edge *ad;
};
void init_graf(Graf *g, int nr){
    g->nrV       = 0;
    g->edgeCount = nr; 
    g->ad = malloc(graphMax*sizeof(Edge));
}
void add_edge(Graf *g, int n1, int n2){
    // Check array bound before adding a new edge
    if (g->nrV < g->edgeCount) {
       // Add the edge to the edge array and increment nrV
       g->ad[g->nrV].startNode = n1;
       g->ad[g->nrV].endNode   = n2;
       g->nrV++;
    }
}
inline int min(const int a, const int b){
    if(a < b)
        return a;
    return b;
}
void read_graf(Graf *g){
    int n,m;
    fscanf(fin,"%d%d",&n,&m);
    init_graf(g,n);
    while(m){
        int x,y;
        fscanf(fin,"%d%d",&x,&y);
        add_edge(g,x,y);
        --m;
    }
}

如果您真的想使用C ,则BO的建议使用&amp;通过引用传递GRAF参数非常好,但是我建议您重组程序以使用类而不是结构并使用C 标头而不是C标头(例如Cstdio而不是STDIO.H)