即使在向链表添加元素后,链表也始终为NULL

时间:2020-07-22 07:59:40

标签: c linked-list

我想列出链表,但是什么也没发生。即使我向其中添加元素,列表也似乎是NULL。函数insertTete将元素添加到列表的开头。 affichListe列出了列表的内容。
我所做的工作是创建一个名为maillon的列表,然后使用liste给它命名为typdef maillon liste。然后,我在liste* l中创建了一个名为int main的变量,并将该变量传递为参数。当我在printf中使用insertTete时,它会显示值,因此insertTete可以工作,但是当我尝试调用affichListe函数时,它什么也不会显示。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct eleve {
    char nom[20];
    char prenom[20];
    int val;
};

struct maillon {
    eleve ele;
    maillon *suivant;
};

typedef maillon liste;

void insertTete(liste *premier, eleve ele) {
     liste *nouvEleve;
     nouvEleve = (liste *)malloc(sizeof(liste));
     nouvEleve->ele = ele;
     nouvEleve->suivant = premier;
     premier = nouvEleve; 
}

liste *dernier(liste *premier) {
    while (premier != NULL)
        premier = premier->suivant;
    return premier;
}

void affichListe(liste *premier) {
    while (premier != NULL) {
        printf("Nom etudiant: %s", premier->ele.nom);
        printf("Prenom etudiant: %s", premier->ele.prenom);
        printf("Note etudiant: %i", premier->ele.val);
    }
}

int main() {
    eleve ele;
    liste *l = NULL;
    
    strcpy(ele.nom, "Ahmed");
    strcpy(ele.prenom, "bejaoui");
    ele.val = 15;
    insertTete(l, ele);
    printf("%i", l == NULL);
    affichListe(l);
}

2 个答案:

答案 0 :(得分:2)

问题是l的值从未修改过。您应该将其作为指针传递给指针

void insertTete(liste** premier, eleve ele) {
  liste* nouvEleve;
  nouvEleve = (liste*) malloc(sizeof(liste));
  nouvEleve->ele = ele;
  nouvEleve->suivant = *premier;
  *premier = nouvEleve;
}

或根据返回值分配它

liste* insertTete(liste* premier, eleve ele) {
  liste* nouvEleve;
  nouvEleve = (liste*) malloc(sizeof(liste));
  nouvEleve->ele = ele;
  nouvEleve->suivant = premier;
  premier = nouvEleve;
  return premier;
}

l = insertTete(l, ele);

答案 1 :(得分:0)

您的代码中存在多个问题:

  • insertTete()应该使用指向起始指针的指针,以便更新调用者的变量。
  • dernier()应该循环while (premier->suivant)。按照当前的编码,它总是返回NULL
  • affichListe()中,您应该更新premier以指向循环体内的下一个节点。

这是修改后的版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct eleve {
    char nom[20];
    char prenom[20];
    int val;
};

struct maillon {
    eleve ele;
    maillon *suivant;
};

typedef maillon liste;

liste *insertTete(liste **premier, eleve ele) {
    liste *nouvEleve = malloc(sizeof(liste));
    if (nouvEleve) {
        nouvEleve->ele = ele;
        nouvEleve->suivant = *premier;
        *premier = nouvEleve; 
    }
    return nouvEleve;
}

liste *dernier(liste *premier) {
    if (premier != NULL) {
        while (premier->suivant != NULL)
            premier = premier->suivant;
    }
    return premier;
}

void affichListe(const liste *premier) {
    while (premier != NULL) {
        printf("Nom étudiant: %s\n", premier->ele.nom);
        printf("Prénom étudiant: %s\n", premier->ele.prenom);
        printf("Note étudiant: %i\n\n", premier->ele.val);
    }
}

int main() {
    eleve ele;
    liste *l = NULL;
    
    strcpy(ele.nom, "Ahmed");
    strcpy(ele.prenom, "Bejaoui");
    ele.val = 15;
    insertTete(&l, ele);
    affichListe(l);
    return 0;
}