C 在其邻接列表中具有自身的节点

C 在其邻接列表中具有自身的节点,c,graph,linked-list,adjacency-list,C,Graph,Linked List,Adjacency List,预期输出是一个值为1的节点,其自身位于其邻接列表中,类似于1->1的输出 这里我的问题是看起来我有两个不同的节点。当我对其中一个节点进行更改时,另一个节点不会更改,就像另一个节点一样 例如,在构建列表之后,如果我更改节点的值,我应该会得到一个输出,如3->3。但我得到3->1。节点上的更改不会影响另一个节点。当我试图将adj[0]指向t->next时,我得到了一个无限循环 你确实可以期待所有你想要的输出,但这不会实现 很明显,您正在创建两个节点,混淆地重用v 我不能完全肯定你想做什么;但是清理代

预期输出是一个值为1的节点,其自身位于其邻接列表中,类似于1->1的输出

这里我的问题是看起来我有两个不同的节点。当我对其中一个节点进行更改时,另一个节点不会更改,就像另一个节点一样


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

你确实可以期待所有你想要的输出,但这不会实现

很明显,您正在创建两个节点,混淆地重用
v

我不能完全肯定你想做什么;但是清理代码以消除两行读取
t=v可能会澄清发生了什么

如果希望
v->next
指向自身,则需要让它这样做。如果需要一个节点,则必须对代码进行结构化,以使
malloc()
只调用一次


记住
顶点*v不声明顶点;它声明了一个指向顶点的指针。

您确实可以期望得到您想要的所有输出,但这不会实现

很明显,您正在创建两个节点,混淆地重用
v

我不能完全肯定你想做什么;但是清理代码以消除两行读取
t=v可能会澄清发生了什么

如果希望
v->next
指向自身,则需要让它这样做。如果需要一个节点,则必须对代码进行结构化,以使
malloc()
只调用一次


记住
顶点*v不声明顶点;它声明了一个指向顶点的指针。

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

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


通常你会这样做:

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;
}
void buildList(){
//列表库
adj[0]=malloc(1*sizeof(*v));
adj[0]->num=1;
adj[0]->next=adj[0];//下一个)v=v->next;//下一个;
v->num=i;

v->next=v;//您应该提供完整的代码,以了解如何使用函数和列表。实际错误可能在别处。 如果到达列表的末尾,您如何比较

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


通常你会这样做:

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;
}
void buildList(){
//列表库
adj[0]=malloc(1*sizeof(*v));
adj[0]->num=1;
adj[0]->next=adj[0];//下一个)v=v->next;//下一个;
v->num=i;

v->next=v;//所生成的代码看起来只是创建了两个单独的节点,然后重新分配了节点t=v,这使得指针只指向一个节点

阵列上节点1的备份不太清楚,原因也不清楚


如果您能解释您试图实现的逻辑,那就太好了。

所提供的代码看起来只是创建了两个单独的节点,然后您只是重新分配了节点t=v,这使得指针只指向一个节点

阵列上节点1的备份不太清楚,原因也不清楚


如果您能解释您试图实现的逻辑,那就太好了。

您可以按如下方式分析代码片段:

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

通过对指针v进行mallocing来分配它。并将其赋值为1。请注意,指向下一个元素v->next的指针未初始化 然后将v复制到adj[0]和t,然后再次对v进行重新初始化(我认为这是多余的),设置其值并将其值复制到t->next 到目前为止,你已经让t指向它自己,即1指向1。但是当你再次将t重新初始化为v时,有v->next未初始化的v会导致t->next也未初始化,因此指向iyself的变量现在是不可能的
在代码的注释部分,与adj[0]发生相同的事情关于无限循环,这是因为在你的工作中使用了上面的代码片段,当单独运行时,在访问t->next时会出现一个分段错误。我不完全清楚你想要什么。如果你想要一个指向自身的
顶点,它很简单

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
  }
}

你能澄清一下这不是你想要的吗?

我不完全清楚你想要什么。如果你想要一个指向自身的
顶点,它很简单

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
  }
}

你能澄清一下这不是你想要的吗?

我在最后放了t=NULL。但它没有改变任何东西。我的意思是
t->next=NULL;
。但这取决于