C语言入门之自定义结构体数据struct Student { int num; char name[20]; char sex; int age; 类型

用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体

例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,如student_1的变量,反映它们之间的内在联系

struct Student
{  
    int num; 
    char name[20]; 
    char sex; 
    int age;  
    float score; 
    char addr[30]; 
};

  • 定义结构体类型变量

        (1)  结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、

          存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。

(2) 结构体类型中的成员名可以与程序中的变量名相同但二者不代表同一对象。

(3) 对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量

(4)结构体变量中的成员访问,采用 .运算符访问

  • 结构体内存分配

  • 结构体变量的初始化和引用

说明:

(1)定义结构体数组一般形式是

struct 结构体名

    {成员表列} 数组名[数组长度];

② 先声明一个结构体类型,然后再用此类型定义结构体数组:

     结构体类型  数组名[数组长度];

   如:struct Person  leader[3];

    

(2)对结构体数组初始化的形式是在定义数组的后面加上:

={初值表列};

 如: struct Person  leader[3]= {"Li",0,"Zhang",0,"Fun",0};

  • 指向结构体变量的指针

指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。

指针变量的基类型必须与结构体变量的类型相同。例如:

   struct Student *p;

为了使用方便和直观,通常使用结构体指针访问成员使用->运算符,而不使用(*结构体指针变

).这种形式去访问成员变量。

改成->运算符访问成员变量

p->num = 10101;

strcpy(p->name,”Zhang”);

p->score = 92.5;

  • 用结构体变量和结构体变量的指针作函数参数

将一个结构体变量的值传递给另一个函数,有3个方法

(1) 用结构体变量的成员作参数。

  例如,用stu[1].numstu[2].name作函数实参,将实参值传给形参。

  1. 用法和用普通变量作实参是一样的,属于“值传递”方式。
  2. 应当注意实参与形参的类型保持一致。

例如: funA(stu[1].num);

(2) 用结构体变量作实参。

  1. 用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量
  2. 在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大
  3. 在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数
  4. 一般较少用这种方法

例如: funB(stu[1]);

(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。

例如: funC(&stu[1]);

结构体内包含另一个结构体

 struct A  {                    struct B {                   

   char c;                             struct A a;

   int  *i;                               float f;

};                                    };

结构体内包含函数指针

struct TEST {

   float f;

   void (*func)(void);

}

  • 结构体位域

位域定义

成员都是按照特定长度的二进制位进行分配

struct 位域结构体名  { 位域列表};

域列表为: 类型说明符 位域名长度;

struct BitField {

unsigned char a : 2; // 第一个位域,2

unsigned char b : 4; // 第二个,4

unsigned char c : 2; // 第三个,2

}Field;

位域可以没有名字的,这时它只用来作填充或调整位置。无名的位域是不能使用

struct BitFiled_1

{

 unsigned a : 4;

 unsigned : 0; // 无名位域, 无法使用        unsigned b : 4;

 unsigned c : 4;

} Filed_1 ;

宽度为 0 的一个未命名位域强制下一位域对齐到其下一type位域的边界

struct BitFiled_1 {

unsigned a : 4; //1unsigned int

unsigned : 0; // 未命名位域

unsigned b : 4; // 从第二个unsigned int

unsigned c : 4; // 还是第二个unsigned int

 } Filed_1; // 该位域结构总共 8 Byte

 

 

#include"stdio.h" #include"stdlib.h" #define NULL 0 struct student { long num; char name[20]; int score[6]; struct student *next; }; void show() { printf("\nthere is a cataloge as follow.\n"); printf("***************************************\n"); printf("* *\n"); printf("* 1. create *\n"); printf("* 2. Insert *\n"); printf("* 3. print *\n"); printf("* 4. delete *\n"); printf("* 5. modify *\n"); printf("* 6. save_to_file *\n"); printf("* 7. lode from file *\n"); printf("* 8. exit *\n"); printf("***************************************\n"); printf("please input 1--8 to choice what you want:\n"); } struct student *create() { struct student *head,*p,*last; int i; int temp2; char name[20]; p=head=(struct student *)malloc(sizeof(struct student)); head->next=NULL; last=p; while(1) { last->next=p; last=p; p=(struct student *)malloc(sizeof(struct student)); /*last->next=p; last=p;*/ p->next=NULL; printf("number:"); scanf("%ld",&p->num); if(p->num==0)break; getchar(); printf("name:"); scanf("%s",p->name); printf("score:"); for(i=0;i<6;i++) { scanf("%d",&temp2); p->score[i]=temp2; } printf("next student's information.\n"); } free(p); return head; } void Insert(struct student *head) { struct student *p,*q; int score; long num; int i; printf("\nEnter the student's information you want to insert.\n"); printf("number:"); scanf("%ld",&num); q->num=num; getchar(); printf("name:"); scanf("%s",q->name); printf("score:(chinese,math,english,biology,physics,chemistry)\n"); for(i=0;i<6;i++) { scanf("%d",&score); q->score[i]=score; } q->next=NULL; p=head; while(p->next->num<q->num&&p->next!=NULL) p=p->next; q->next=p->next; p->next=q; if(p->next==NULL) p->next=q; } void delete(struct student *head) { struct student *p,*q; long num; printf("enter the student's information you want to delete.\n"); printf("number:"); scanf("%ld",&num); getchar(); p=head; while(p->next!=NULL&&p->next->num!=num) p=p->next; q=p->next; p->next=p->next->next; free(q); } void print(struct student *head) { struct student *p; int i; p=head->next; if(p==NULL) { printf("\nthere is no information.\n"); exit(0); } printf("\nnumber\tnamme\tchinese\tmath\tenglish\tbiology\tphysics\tchemistry\n"); while(p!=NULL) { printf("\n%ld\t%s",p->num,p->name); for(i=0;i<6;i++) printf("\t%d",p->score[i]); p=p->next; } } void modify(struct student *head) { struct student *p; int choice,i; long num; char name[20]; int score[6]; printf("\nEnter what student's information you want to modify.\n"); printf("number:"); scanf("%ld",&num); getchar(); printf("\nname:"); scanf("%s",name); printf("\n"); p=head->next; while(p->num!=num&&p->name[20]!=name[20]&&p!=NULL) p=p->next; printf("\nplease choice what you want to modify:1-number 2-name 3-score.\n"); scanf("%d",&choice); switch(choice) { case 1:printf("\nEnter the true number:"); scanf("%ld",&num); p->num=num; break; case 2:printf("\nEnter the true name:"); scanf("%s",p->name); break; case 3:printf("\nEnter the right score:"); for(i=0;i<6;i++) { scanf("%d",&score[i]); p->score[i]=score[i]; } break; } } void save_in(struct student *head) { struct student *p; FILE *fp; char file_name[30]; printf("please enter the file name you want to save.\n"); scanf("%s",file_name); printf("save to file:%s",file_name); if((fp=fopen(file_name,"w"))==NULL) { printf("can't open the file.\n"); exit(0); } p=head; while(p->next!=NULL) { fwrite((void*)p->next,sizeof(struct student),1,fp); p=p->next; } fclose(fp); } struct student *load_from_file() { struct student *head,*p,*last; FILE *fp; char file_name[30]; head=(struct student *)malloc(sizeof(struct student)); last=head; head->next=NULL; printf("please enter the file name you want to save.\n"); scanf("%s",file_name); printf("save to file:%s",file_name); if((fp=fopen(file_name,"r"))==NULL) { printf("can't open the file.\n"); exit(0); } p=(struct student *)malloc(sizeof(struct student)); p->next=NULL; while(fp=fread((void *)p,sizeof(struct student),1,fp)==1) { last->next=p; last=p; p=(struct student *)malloc(sizeof(struct student)); p->next=NULL; } free(p); fclose(fp); return head; } void main() { struct student *la; int choice; /*char Yes_No;*/ la=(struct student *)malloc(sizeof(struct student)); la->next=NULL; while(1) { show(); scanf("%d",&choice); switch(choice) { case 1:la=create(); break; case 2:Insert(la); break; case 3:print(la); break; case 4:delete(la); break; case 5:modify(la); break; case 6:save_in(la); break; case 7:la=load_from_file(); break; case 8:exit(0); } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雨依依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值