我对循环链表有一点问题:我想在最后插入一个元素(整数)。我的函数在最后添加元素但我的链表不是真正的圆形(我有这种印象)。 这是.h和我使用的结构:
struct liste_circulaire {
int val;
struct liste_circulaire *suivant; /* suivant = next element */
};
typedef struct liste_circulaire liste;
int main(void) {
liste *l, *deb;
deb = (liste *)malloc(sizeof(liste));
l = deb;
l -> suivant = deb; /* suivant = next element */
ajouter_element(l,0);
ajouter_element(l,1);
ajouter_element(l,2);
ajouter_element(l,3);
affiche(l,l->suivant);
printf("%d\n",l->suivant->suivant->suivant->suivant->suivant->val);
return 0;
}
void ajouter_element(liste *l,int x) {
liste *deb = l; /* with this line, I have a pointeur on the first element of my list */
while(l->suivant != deb) {
l = l -> suivant;
}
l -> suivant = (liste *)malloc(sizeof(liste));
l = l -> suivant;
l -> val = x;
l -> suivant = deb;
}
void affiche(liste *l,liste *deb) {
if(l == deb) {
printf(" Fin\n");
return;
}
printf(" %d -->",deb->val);
affiche(l,deb->suivant);
}
在我的主要内容中,当我要求打印列表的第一个元素时,我有随机数,但在我的例子中,我的列表中的第一个值为0.所以,如果有人可以帮助我(我希望清楚,我是法国学生)谢谢!
答案 0 :(得分:2)
您的程序正在打印一个随机数:
liste *l, *deb;
deb = (liste *)malloc(sizeof(liste));
l = deb;
l -> suivant = deb;
列表中的第一个元素是您正确分配的节点,但您没有给出任何数字。你应该尝试添加:
l -> val = 0;
摆脱:
ajouter_element(l,0);
这可以解决您的问题。
答案 1 :(得分:1)
您可以将预定义的头文件list.h
用于循环链接列表:
以下链接包含example如何操作。
list.h
包含与圆形链表管理相关的所有功能,如定义,添加在头部,添加尾部,删除,foreach函数来浏览循环链表......
答案 2 :(得分:0)
请注意,您从未设置第一个元素的值。 (赫尔南在这里打败了我......)
当你调用ajouter_element()时,它不仅会将新元素添加到列表的末尾,而是将列表的开头设置为新元素:
l = l -> suivant;
affiche()
首先打印第二个元素,最后打印第一个元素。第一个要打印的是deb->val
,其中主要是l->suivant->val
。
如果您希望affiche()
打印第一个项目...打印它! :
void affiche(liste *l,liste *deb) {
if (deb == 0)
{
deb = l;
}
printf(" %d -->",l->val);
if(l->suivant == deb) {
printf(" Fin\n");
return;
}
affiche(l->suivant,deb);
}
请使用以下方式调用:
affiche(l,0);
或
affiche(l,l);
他们都会做同样的事情。您也可以重载它以仅采用单个值。
我没有运行(甚至编译),但希望它相当接近。