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的备份,数组不是那么清楚,背后的原因。
如果你能解释一下你想要达到的逻辑,那就太好了。