gpt4 book ai didi

c - 如何将结构体中的指针直接分配给新结构体?

转载 作者:行者123 更新时间:2023-11-30 15:24:52 25 4
gpt4 key购买 nike

你能帮我一下吗?

我想操纵一个管理银行帐户的双向链接列表,但我不知道为什么它不起作用,即使我徒劳地尝试纠正所有错误。当然,这是我第一次使用这个嵌套结构体,我不知道如何从主结构体访问其他结构体(idt,idf)。

2 个问题:

-此方法是否接受“pnt->idt.dn.j_n”(pnt 是 CompteBancaire 上的指针)?

-当我使用指针遍历主链接列表并且我想将特定结构添加到我的新列表(YoungCustomers)时,是否有可能将结构指针分配给我将其放入我的新结构新列表,而不是将每个元素分配给它? 提前致谢。

#include <stdio.h>
#include <stdlib.h>
#include <string.h >
typedef struct
{ int j_n,m_n,a_n;
}dateDeNaissance;

typedef struct
{ char nom[15];
char prenom[15];
dateDeNaissance dn;
}identite;

typedef struct
{ int numCompte;
char nomBanque[20];
}identifiant;
/* ------------THE MAIN STRUCT-------------*/
typedef struct
{ identite idt;
identifiant idf;
float solde;
struct CompteBancaire *next;
struct CompteBancaire *prc;
}CompteBancaire;
/* -----------STRUCT OF YOUNG CUSTOMERS----------------*/
typedef struct
{ CompteBancaire *Cpt;
struct ClientJeune *next;
}ClientJeune;
/*-------------GLOBAL POINTERS------------- */
CompteBancaire *first=NULL;
CompteBancaire *first2=NULL;
/*---------- CREATE A BANC ACOUNTE ---------*/
void saisiNovCompt (char nom[],char prn[],int j,int m,int a,int numCpt,char nomB[],float Solde) //21:32
{ CompteBancaire *nov=malloc(sizeof(CompteBancaire)),pnt=first;
strcpy (nov->idt.nom,nom);
strcpy (nov->idt.prenom,prn);
nov->idt.dn.j_n=j;
nov->idt.dn.m_n=m;
nov->idt.dn.a_n=a;
nov->idf.numCompte=numCpt;
nov->prc=NULL;
strcpy (nov->idf.nomBanque,nomB);
nov->solde=Solde;
if (first==NULL)
{ nov->next=NULL;
nov->prc=NULL;
first=nov;
}
else
{ first=nov;
nov->next=pnt;
pnt->prc=nov;
}
}
/* --------SAVE AN ACCOUNTE IN FILE-------------*/
void fichier (CompteBancaire *pnt)
{ FILE *Compte;
Compte=fopen("comptBancaire.txt","w");
fprintf("nom: %s\nprenom: %s\ndate de naissance: %d/%d/%d\nnum de compte: %d\nnom de la banque: %s\nsolde: %.2f\n",
pnt->idt.nom,pnt->idt.prenom,pnt->idt.dn.j_n,pnt->idt.dn.m_n,pnt->idt.dn.a_n,pnt->idf.nomCompte,pnt->idf.nomBanque);
fclose(Compte);
}
/* -------------- SAVE AN ACCOUNT THAT IT'S NUMBER IS GIVEN BY THE USER ------------------*/
void afficheParNum (int numCpt)
{ CompteBancaire *pnt=first;
if (first==NULL)
printf ("la liste est vide \n");
else
{ while (pnt!=NULL && pnt->idf.numDeCompt!=numCpt)
pnt=pnt->next;
if (pnt==NULL)
printf("Compte non trouve !\n");
else
fichier(pnt);
}
}
/*-----------------REMOVE AN ACCOUNT THAT IT'S NUMBER IS GIVEN BY THE USER--------------------*/
void suppCompt (int numCpt)
{ CompteBancaire *pnt=first;
if (first==NULL)
printf("la liste vide !\n");
else
{ while (pnt!=NULL && pnt->idf.numCompte!=numCpt)
pnt=pnt->next;
if (pnt==first) // remove in beginning
{ first=pnt->next;
free(pnt);
}
else if (pnt->next==NULL) // remove at the end
{ (pnt->prc)->next=NULL;
free(pnt);
}
else // remove in the middle
{ (pnt->prc)->next=pnt->next;
(pnt->next)->prc=pnt->prc;
free(pnt);
}
}
}
}
/* ------------------REMOVE THE ACCOUNT IF THE BALANCE IS LESS THEN 0 DH--------------------------*/
void suppInf00 ()
{CompteBancaire *pnt2=first,*pnt=NULL;
if (first==NULL)
printf("la liste vide !\n");
else
{ while (pnt2!=NULL) {
pnt=pnt2;
if (pnt->solde <0) {
if (pnt==first) // remove in the beginning
{ first=pnt->next;
free(pnt);
else if (pnt->next==NULL) // remove at the end
{ (pnt->prc)->next=NULL;
free(pnt);
}
else // remove in the middle
{ (pnt->prc)->next=pnt->next;
(pnt->next)->prc=pnt->prc;
free(pnt);
}
}
pnt2=pnt2->next;
}
}
}

}
/* -----------CREAT A LISTE OF YOUNG PEAPLE--------------------- */
void under35 ()
{ ClientJeune nov,*pnt=first;
if (first==NUll)
printf("liste vide !\n");
else
{ while (pnt!=NULL)
if (2015-(pnt->idt.dn.a_n)<=35)
{ nov->Cpt=pnt;
if (first2==NULL)
nov->next=NULL;
else
{ nov->next=first2;
first2=nov;
}
}
}
}
/* -----------------DISPLAY ALL ACCOUNTS---------------------*/
void afficage ()
{CompteBancaire *pnt=first;
if(first==NULL)
printf("liste vide !\n");
else
{ while (pnt!=NULL)
printf("nom: %s\nprenom: %s\ndate de naissance: %d/%d/%d\n num de compte: %d\nnom de la banque: %s\nsolde: %.2f\n\n",
pnt->idt.nom,pnt->idt.prenom,pnt->idt.dn.j_n,pnt->idt.dn.m_n,pnt->idt.dn.a_n,pnt->idf.nomCompte,pnt->idf.nomBanque);
pnt=pnt->next;
}

}
int main()
{int n=0,c,j,m,a,numC;
float S=0;
char A[15],B[15],C[15];
printf("-----------------Menu-------------------\n");
printf("1----------------------------------Saisi\n");
printf("2----------------------------------affichage par num de compte \n");
printf("3----------------------------------Suppression d'un compte \n");
printf("4----------------------------------Supp inf 00 DH\n");
printf("5----------------------------------under 35ans\n");
printf("6----------------------------------Affichage\n\n");
while (n==1)
{
printf("donner votre choix :");
scanf("%c",&c);
switch (c)
{ case 1:printf("donner le nom:");scanf("%s",A);
printf("donner le prenom:");scanf("%s",B);
printf("donner la date de naissance jj mm aa:");scanf("%d %d %d",&j,&m,&a);
printf("donner le num du compte:");scanf("%d",&numC);
printf("donner le nom de la banque:");scanf("%s",C);
printf("donner le solde :");scanf("%f",&S);
saisiNovCompt(A,B,j,m,a,numC,C,S);break;
case 2:printf("donner le num du compte:");scanf("%d",&numC);
afficheParNum(numC);break;
case 3:printf("donner le num du compte:");scanf("%d",&numC);
suppCompt(numC);break;
case 4:suppInf00();
printf("suppression solde inf 0 à ete efectue\n");break;
case 5:under35 ();
printf("une nouvelle liste a ete creer\n");break;
case 6:affichage();
default:printf("tapper 1/2/3/4/5/6 !!\n");
}
printf("tapper 1:");
scanf("%d",&n);
}
return 0;
}

最佳答案

我不知道我是否理解正确,但是如果你想初始化一个结构并将其地址分配给一个指针

假设你有

struct XXX
{
T1 arg1;
T2 arg2;
T3 arg3;
.
.
.
};

你可能想做这样的事情:

struct XXX *ptr = &(struct XXX){arg1, arg2, arg3, ...};

也许这不是最优雅的方式,但它确实有效。

关于c - 如何将结构体中的指针直接分配给新结构体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28196413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com