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,我的问题得到了解决。然后请不要修改问题中的代码。这使得问题对其他人来说毫无价值,因为它实际上没有描述问题。