C语言 在其邻接表中有自己的节点


typedef struct vertex{
    int num;
    struct vertex *next;
} Vertex;
Vertex *adj[1];
void buildList(){
    Vertex *v=NULL;
    Vertex *t=NULL;
    v = malloc(1*sizeof(*v));
    v->num = 1;
    adj[0] = v;  //a NODE with value 1
    t = v;
    v = malloc(1*sizeof(*v));
    v->num = 1;
    t->next = v; // and ANOTHER NODE but it should be the SAME NODE with the above one
    t = v;

    //v = malloc(1*sizeof(*v));
    //v->num = 1;
    //t->next = adj[0]; // causes infinite loop...
    //t = v;
}

期望的输出是一个值为1的节点,其本身在其邻接表中,如1 -> 1的输出。

这里我的问题是它看起来像我有两个不同的节点。当我在其中一个上做了改变,另一个不会改变,就像另一个节点一样。

例如,在构建列表后,如果我更改节点的值,我应该得到类似3 -> 3的输出。但我得到3 -> 1。节点上的变化不会影响另一个节点。当我试图将adj[0]指向t->时,我得到了一个无限循环…

我不太清楚你想要什么。如果你想要一个指向自身的Vertex,只需

void buildList(){
    adj[0] = malloc(1*sizeof(*adj[0])); // allocate memory for one Vertex
    if (adj[0] == NULL){
        perror("Allocation of Vertex failedn");
        exit(EXIT_FAILURE);
    }
    // adj[0] contains the adress of a Vertex
    // set the num of the Vertex
    adj[0]->num = 1;
    // set the next pointer of the Vertex to its address
    adj[0]->next = adj[0];
}

你能说清楚这不是你想要的吗?

您确实可以期望得到您想要的输出,但这不会使它发生。

您非常清楚地创建了两个节点,令人困惑地重用v来这样做。

我不完全确定你想做什么;但是清理代码以消除读取t = v;的两行可能会澄清正在发生的事情。

如果你想让v->next指向自己,你需要让它这样做。如果你想要一个节点,你必须构造你的代码,使malloc()只被调用一次。

请记住,Vertex *v;没有声明一个顶点;它声明了一个指向顶点的指针

你可以这样分析代码片段:

    你通过错配来分配指针v。并赋值1。注意,指向下一个元素的指针v->next是未初始化的
    然后将v复制到adj[0]和t.并再次进行v的重新初始化,(我认为这是多余的),设置其值并将其值复制到t->next
    到目前为止,你得到了t指向自身即1指向1,但是当你再次将t初始化为v时,v->next未初始化导致t-> next也未初始化因此指向自身的变量现在是不可能的
    在代码的注释部分中发生了同样的事情,adj[0]是v。因此,关于无限循环,这是由于在您的工作中使用了上述代码片段,当单独运行时,会在访问t->next
时给您一个分段错误。

您应该提供完整的代码,以了解如何使用该函数和列表。实际的错误可能在其他地方。如果到达列表的末尾,您将如何比较?

通常链表最后一个节点的next指针被赋值为NULL。这将不太可能导致无限循环。


通常你会这样做:

void buildList(){
  // the list base
  adj[0] = malloc(1*sizeof(*v));
  adj[0]->num = 1;
  adj[0]->next = adj[0]; // <-- make the last node point to itself
  // append more items to the end of the list
  Vertex *v=adj[0];
  while (v != v->next) v = v->next; // <-- find the end of the list
  int i;
  int num_nodes = 1; // <-- specify the number of nodes you want in total
  for (i = 1; i < num_nodes; i++) {
    // append another item
    v->next = malloc(1*sizeof(*v)); 
    // initialize it
    v = v->next;
    v->num = i; 
    v->next = v; // <-- make the last node point to itself
  }
}

,而你所描述的无限循环可能是因为你将列表基赋值到列表的末尾。

这段代码看起来就像是在创建2个独立的节点,然后你只是重新分配节点t=v,这使得指针只指向一个节点。

节点1的备份,数组不是那么清楚,背后的原因。

如果你能解释一下你想要达到的逻辑,那就太好了。

相关内容

  • 没有找到相关文章

最新更新