当我试图遍历我练习的链表时,我很难理解为什么我有一个无限循环:
#include <stdio.h>
#include <stdlib.h>
typedef struct noeud {
int val;
struct noeud *next;
} noeud;
noeud* add_first(noeud* head, int val){
noeud* p = malloc(sizeof(noeud));
if(p == NULL){
puts("ERROR ALLOCATING NODE ");
exit(-1);
}
else{
p->val = val;
p->next = head;
}
return p;
}
void discover(noeud* head){
noeud* current = head;
while(current != NULL){
printf("---|%d|-|%p|---",current->val, current->next);
current = head->next;
}
}
int main(){
noeud* head = malloc(sizeof(noeud));
head->next = NULL;
head = add_first(head, 5);
head = add_first(head, 4);
head = add_first(head, 3);
head = add_first(head, 8);
discover(head);
return 0;
}
这就是我所做的:我创建了一个像push这样的函数,首先添加节点,每个节点都链接到前一个节点,每次推送新内容时,我都会更新头部以获取第一个节点。
然后我只是试图打印结果和下一个节点的地址,为了这样做,我使用了一个while循环,我会验证NULL条件,我相信问题是在更新head之后,那么head->next
不再是NULL,但我真的找不到将最后一个元素指向null的方法。
答案 0 :(得分:1)
在函数的开头,您将头指针复制到堆栈变量for($i=1990;$i<2019,$i++){
for($j=1;$j<5;$j++){
$film = "API";
$sve = file_get_contents($film);
$data = json_decode($sve);
foreach($data->results as $key => $value){
$filmovi .= $value->title . ",";
}
}
,但随后在while循环中将堆栈变量分配给头部的下一个成员noeud* current = head;
。
这只会导致连续分配到同一个current = head->next;
地址,永远不会移动next
只需将其切换为此地址:
current
答案 1 :(得分:0)
如何为头部节点分配内存看起来很奇怪,你不需要这样做。您只需要一个像noeud* head = NULL;
那样的单个HEAD指针。
您的main()
变为:
int main(){
noeud* head = NULL;
head = add_first(head, 5);
head = add_first(head, 4);
head = add_first(head, 3);
head = add_first(head, 8);
discover(head);
return 0;
}
然后你必须根据Josh Weinstein的答案修改你的打印功能:
void discover(noeud* head){
noeud* current = head;
while(current != NULL){
printf("---|%d|-|%p|---\n",current->val, current->next);
current = current->next;
}
}