C 如何在不替换当前第一个元素的情况下在链表的开头添加元素?
我有以下结构元素:C 如何在不替换当前第一个元素的情况下在链表的开头添加元素?,c,pointers,linked-list,C,Pointers,Linked List,我有以下结构元素: typedef struct struct_element{ Tache t; struct struct_element *suivant; }Element; typedef Element* Liste; 我试图创建一个函数“ajoudeb”,它应该创建一个新元素,并使列表中当前的第一个元素成为新元素的下一个元素。这样新元素将被放置在链表的开头。以下是我对它的实现: void ajoutdeb(Liste* l, Tache t) { Elem
typedef struct struct_element{
Tache t;
struct struct_element *suivant;
}Element;
typedef Element* Liste;
我试图创建一个函数“ajoudeb”,它应该创建一个新元素,并使列表中当前的第一个元素成为新元素的下一个元素。这样新元素将被放置在链表的开头。以下是我对它的实现:
void ajoutdeb(Liste* l, Tache t)
{
Element e;
e.t = t;
e.suivant = *l;
*l = &e;
}
我的问题是新元素的下一个元素是它本身。我的函数逻辑有什么问题
示例代码:
#include <stdio.h>
typedef struct{
int no; /*le nom de la tache*/
int duree; /* la duree de la tache*/
int nbPred; /* le nombre effectif de predecesseur de la tache*/
int pred[16]; /*le tableau des predecesseurs*/
char titre[256]; /*le titre de la tache*/
}Tache;
typedef struct struct_element{
Tache t;
struct struct_element *suivant;
}Element;
typedef Element* Liste;
void ajoutdeb(Liste* l, Tache t)
{
Element e;
e.t = t;
e.suivant = *l;
*l = &e;
}
int main()
{
int nb;
Liste liste = NULL;
Tache t1 = {
.titre = "Init",
.no = 0
};
Tache t2 = {
.titre = "Deuxième",
.no = 1
};
ajoutdeb(&liste, t1);
ajoutdeb(&liste, t2);
return 0;
}
#包括
类型定义结构{
国际编号;/*塔奇的名称*/
int duree;/*la duree de la TACH*/
int nbPred;/*塔赫死亡前的正常效应*/
int pred[16];/*先人表*/
char titre[256];/*le titre de la tache*/
}环节;
类型定义结构元素{
环节t;
结构元素*suivant;
}元素;
typedef元素*Liste;
无效ajoutdeb(列表*l,附件t)
{
元素e;
e、 t=t;
e、 suivant=*l;
*l=&e;
}
int main()
{
int nb;
Liste-Liste=NULL;
环节t1={
.titre=“Init”,
.no=0
};
环节t2={
.titre=“Deuxième”,
.no=1
};
Ajoudeb(和liste,t1);
Ajoudeb(和liste,t2);
返回0;
}
在ajoutdeb()
函数中,您需要返回类型来指示向调用函数添加新节点的成功或失败。将返回类型设置为指向节点的指针是一个不错的选择。失败时,可以返回NULL
,成功时,可以返回列表的新头节点
您的ajoutdeb()
函数需要:
NULL
以指示失败。如果成功,则可以完成将节点添加到列表中
总之,你可以做类似的事情:
Element *ajoutdeb(Element **l, Tache t)
{
Element *e = malloc (sizeof *e);
if (!e) { /* validate EVERY allocation */
perror ("malloc-e");
return NULL; /* return NULL on failure */
}
e->t = t; /* fully initialize new node */
e->suivant = NULL;
e->suivant = *l; /* make e->suivant point to list */
*l = e; /* update list pointer to current */
return *l; /* return new head node on success */
}
(注意:避免类型定义指针。这隐藏了一定程度的间接性。在60行代码中,可能很容易在屏幕顶部看到Liste
实际上是类型元素*
,但在处理许多类型的指针和级别的ind时,这会变得越来越困难方向(参见)
您可能需要检查实现的其他详细信息,然后查看在需要更改时使用tail
指针在列表末尾提供O(1)插入的好处
如果您还有其他问题,请告诉我。一个问题是变量
e
存在于堆栈中,因此在函数结束后将无法访问。请回答。问题在显示的代码中,但为了解释问题,我们需要一个公共上下文来参考。您显示的新代码不应该有您想要的问题描述。你如何检查问题?谢谢。看起来通过动态分配e,我的问题得到了解决。然后请不要修改问题中的代码。这使得问题对其他人来说毫无价值,因为它实际上没有描述问题。