Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言中扩展图结构_C_Algorithm_Data Structures_Struct - Fatal编程技术网

在c语言中扩展图结构

在c语言中扩展图结构,c,algorithm,data-structures,struct,C,Algorithm,Data Structures,Struct,我的问题:我有一个由节点结构组成的图形 struct node { node *n1; node *n2; } 我想添加一些成员来创建一个新的结构newNode struct newNode { newNode *n1; newNode *n2; newNode *n3; // new member int a; // new member } 我想在图中保留原始的“节点连接”,以便 newNode *n; n->n1->n2...

我的问题:我有一个由
节点
结构组成的图形

struct node {
   node *n1;
   node *n2;
}
我想添加一些成员来创建一个新的结构
newNode

struct newNode {
   newNode *n1;
   newNode *n2;
   newNode *n3; // new member
   int      a;  // new member
}
我想在图中保留原始的“节点连接”,以便

newNode *n;
n->n1->n2...
就像

node *n;
n->n1->n2...
其中,两个结构的n1(或n2)表示图中的相同节点,而我也可以这样做

newNode *n;
n->n1->a...
n->n1->n3...
修改
节点
结构很棘手,因为它是在大型库中定义的

我的想法是在
newNode
struct中再添加一个成员

struct newNode {
   node    *n; // added member
   newNode *n1;
   newNode *n2;
   newNode *n3;
   int      a;
}
首先,我为每个
节点创建一个
newNode
n\u new
。然后我遍历每一对
n\u new
s,比如n\u new1和n\u new2,查看
n\u new1->n
n\u new2->n
,看看它们之间是否有联系,也就是说,
n\u new1->n->n1==n\u new2->n
,或者
n\u new1->n->n2==n\u new2
。如果是这样的话,我会使
n\u new1->n1=n\u new2
,或者
n\u new1->n2=n\u new2
,反之亦然

但是时间复杂度是
O(#node^2)
。效率低下

还有其他想法吗


p.S.该图是一个简化有序的二元决策图。

您必须递归复制,每次遇到新节点时都创建一个新节点(请仔细阅读)。这将是原始图形的完整副本,结构相同,但使用不同的内存

为了确定我们是否已经复制了一个节点,我们在一个将节点*映射到新节点*的BST中保留了一个已复制节点(及其副本)的列表

您可以在那里找到许多BST实现。在STL C++库中有一个,例如,我认为GLIMC,等等。p> 代码如下所示:

struct node {
   node *n1;
   node *n2;
}

struct new_node {
   node *n1;
   node *n2;
   newNode *n3; // new member
   int      a;  // new member
}

new_node* GraphCopy (node* start)
{
    new_node* n_new;

    if(!start) return NULL;

    n_new = malloc(sizeof(new_node));

    //Add start.n1 and start.n2 to a bst here
    //with keys of node* and vals of new_node*

    TreeInsert(start, n_new)

    if(IsInTree(start->n1))
        n_new->n1 = TreeFind(start->n1);
    else
        n_new->n1 = GraphCopy(start->n1);

    //repeat for n2

 }
如果没有树,复杂性将是线性的,所以它仍然相当快。(例如,它与哈希表更为线性。)


(树会将节点*映射到它们的副本。)

您想要一个包含新节点和节点的图吗?@user3125280我想要保留原始节点(和连接),但也要添加一些新节点。这两个结构首先应该表示同一个图。啊,我现在明白了-你想基本上复制一个图结构。你所描述的确实是一种非常缓慢的方式。我建议你谷歌复制一个图形数据结构或类似的。基本上,要复制一个节点,创建一个n_new,然后用旧节点的n1和n2的副本填充其n1和n2。您将需要一种机制来确定您已经复制了哪个节点(这里可能需要bst或哈希,除非您可以更改节点的源)。