首页 > 解决方案 > 有没有办法在结构中自动创建结构

问题描述

这段代码创建了一个“循环”,其中第一个元素指向空并指向下一个元素(如果有),如果没有,则指向空

typedef struct noeud
{
    struct noeud* point_suivant;
    struct noeud* point_precedent;
    int valeur;
    int n;

}t_noeud;
typedef struct anneau
{
    
    t_noeud* noeud;
    int nb_points;

}t_anneau;

这是 t_noeud_init

t_noeud* t_noeud_init(const int valeur) {
    t_noeud* nouveau_noeud = (t_noeud*)malloc(sizeof(t_noeud));

    if (nouveau_noeud == NULL) {
        printf("EXIT_FAILURE");
        return NULL;
    }

    nouveau_noeud->valeur = valeur;
    nouveau_noeud->point_suivant = NULL;
    nouveau_noeud->point_precedent = NULL;
    return nouveau_noeud;
}

这是 t_noeud_add

t_noeud* t_noeud_add(const int valeur, t_noeud* noeud_precedent) {
    t_noeud* nouveau_noeud = (t_noeud*)malloc(sizeof(t_noeud));
    if (nouveau_noeud == NULL) {
        printf("EXIT_FAILURE");
        return NULL;
    }
    noeud_precedent->point_suivant = nouveau_noeud;
    nouveau_noeud->valeur = valeur;
    nouveau_noeud->point_suivant = NULL;
    nouveau_noeud->point_precedent = noeud_precedent;
    return nouveau_noeud;
}

这是 t_anneau_init

t_anneau* t_anneau_init() {//remplie de zero
    t_anneau* nouveau_anneau = (t_anneau*)malloc(sizeof(t_anneau));
    if (nouveau_anneau == NULL) {
        printf("EXIT_FAILURE");
        return NULL;
    }
    
    
    nouveau_anneau->noeud = t_noeud_init(zero);     
        nouveau_anneau->noeud->n = 0;
        nouveau_anneau->nb_points = 0;
        
        nouveau_anneau->noeud->point_suivant =
        t_noeud_add(zero, nouveau_anneau->noeud); 
            nouveau_anneau->noeud->point_suivant->n = 1;
            nouveau_anneau->nb_points = nouveau_anneau->nb_points + 1;
    nouveau_anneau->noeud->point_suivant->point_suivant = 
        t_noeud_add(zero, nouveau_anneau->noeud->point_suivant); 
            nouveau_anneau->noeud->point_suivant->point_suivant->n = 2;
            nouveau_anneau->nb_points = nouveau_anneau->nb_points + 1;
    nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant = 
        t_noeud_add(zero, nouveau_anneau->noeud->point_suivant->point_suivant); 
            nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant->n = 3;
            nouveau_anneau->nb_points = nouveau_anneau->nb_points + 1;
    nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant->point_suivant = 
        t_noeud_add(zero, nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant); 
            nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant->point_suivant->n = 4;
            nouveau_anneau->nb_points = nouveau_anneau->nb_points + 1;
    nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant->point_suivant->point_suivant = 
        t_noeud_add(zero, nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant->point_suivant); 
            nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant->point_suivant->point_suivant->n = 5;
            nouveau_anneau->nb_points = nouveau_anneau->nb_points + 1;
    nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant->point_suivant->point_suivant->point_suivant = 
        t_noeud_add(zero, nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant->point_suivant->point_suivant); 
            nouveau_anneau->noeud->point_suivant->point_suivant->point_suivant->point_suivant->point_suivant->point_suivant->n = 6;
            nouveau_anneau->nb_points = nouveau_anneau->nb_points + 1;
    
    
    return nouveau_anneau;
}

这是一段巨大的代码,这就是为什么我想自动化它但我尝试过的不起作用。

我尝试了这样的事情:

for (int i = 0; i < 6; i++) {
        nouveau_anneau->noeud->point_suivant = t_noeud_add(zero, nouveau_anneau->noeud);
        nouveau_anneau->nb_points = nouveau_anneau->nb_points + 1;
        nouveau_anneau->noeud = nouveau_anneau->noeud->point_suivant;
    }

它会建立在自己的基础上,但似乎无法让它发挥作用。

有什么建议么?

标签: cstruct

解决方案


我认为您只需要对您的for想法进行一些工作,也许可以试试下面的代码。我只是添加了两个辅助变量来保存 current 和 previous point_suivant

t_anneau* t_anneau_init() {//remplie de zero
    t_anneau* nouveau_anneau = (t_anneau*)malloc(sizeof(t_anneau));
    if (nouveau_anneau == NULL) {
        printf("EXIT_FAILURE");
        return NULL;
    }
        
    nouveau_anneau->noeud = t_noeud_init(zero);     
    nouveau_anneau->noeud->n = 0;
    nouveau_anneau->nb_points = 0;
        
    struct noeud* prev_point_suivant = nouveu_anneau->noeud;
    struct noeud* cur_point_suivant = prev_point_suivant->point_suivant;

    for (int i = 1; i <= 6; ++i) {
        cur_point_suivant = t_noeud_add(zero, prev_point_suivant);
        cur_point_suivant->n = i;
        ++nouveau_anneau->nb_points;

        prev_point_suivant = cur_point_suivant;
        cur_point_suivant = cur_point_suivant->point_suivant;
    }

    return nouveau_anneau;
}

推荐阅读