为什么我不能在C中遍历此链表?

时间:2018-05-14 20:05:56

标签: c linked-list

当我试图遍历我练习的链表时,我很难理解为什么我有一个无限循环:

#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的方法。

2 个答案:

答案 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;
    }

}