c - 有没有办法在结构中自动创建结构
问题描述
这段代码创建了一个“循环”,其中第一个元素指向空并指向下一个元素(如果有),如果没有,则指向空
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;
}
它会建立在自己的基础上,但似乎无法让它发挥作用。
有什么建议么?
解决方案
我认为您只需要对您的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;
}
推荐阅读
- reactjs - 当我增加计数器时,它增加了 2 而不是 1。我为此使用反应上下文
- laravel - Laravel 支付 ID 存储错误
- javascript - 如何在javascript中将字符串转换为数组
- android - POST 尝试时的 Android 代码 = 400“错误请求”
- c - 在 C 中,& 运算符在这样使用时会做什么:(x & y)?
- laravel - 如何使用 laravel 创建有限的搜索结果,如果限制 exsausted 用户将不再能够搜索
- vuejs2 - 在没有激活器的情况下使用 Vue、Vuex 和 Vuetify 为每个卡片项创建对话框的最佳实践是什么
- javascript - 请解释为什么此代码返回未定义
- android - NullPointerException 错误。应用程序运行但一直停止。请提供任何帮助
- python - 如何在tensorflow中使用给定的分隔符生成词汇?