我想列出链表,但是什么也没发生。即使我向其中添加元素,列表也似乎是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);
}
答案 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;
}