一、结构体(一般类型)
1.结构体类型定义的一般形式为:
struct 结构体名
{
数据类型 成员1;
数据类型 成员2; //结构成员可以是任意的基本数据类型,也可以是数组、指针类型的变量、结构体变量。
数据类型 成员3;
}; //最后的;不能少
例:
struct data
{
int year;
int month ;
int day;
};
struct student
{
long num;
char sex;
char name[10];
struct data birthday;
float score;
};
1.结构体变量的说明
1.1先定义结构体类型,再说明结构体变量
struct student
{
int num;
char name[10];
char sex;
float score;
};
struct student stu1,stu2;
1.2.在定义结构体的同时定义结构体变量
struct 结构体名
{
数据类型 成员 1;
数据类型 成员 2;
……
数据类型 成员 n;
}结构体变量名列表;
struct student
{
int num;
char name[10];
char sex;
float score;
}stu1,stu2;
1.3.如何使用结构体的成员变量
1 #include <stdio.h> 2 struct student 3 { 4 long int num; 5 char name[20]; 6 char sex; 7 char addr[30]; 8 }a = {89031, "Li Lin", 'M', "123 Beijing Road"}; //定义了结构体变量,并给予赋值 9 void main() 10 { 11 printf("NO. : %d\nname: %s\nsex: %c\naddress: %s\n", a.num, a.name, a.sex, a.addr) //输出结构体成员的值 12 }
注意:一个结构体变量不能作为一个整体输入/出,必须要分别输入/出单个成员变量
1.4.结构体数组
struct student
{
int mum;
char name[20];
char sex;
int ag;
float score;
char addr[30];
}stu[3] = {{10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"},
{10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"},
{10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"}};
1.5实例
1 #include <stdio.h> 2 #include <string.h> 3 #include <stlib.h> 4 5 struct person 6 { 7 char name[20]; 8 int count; 9 }leader[3] = {{"Li", 0}, 10 {"Zhang", 0}, 11 {"Fun", 0}}; 12 13 void main() 14 { 15 int i, j; 16 char leader_name[20]; 17 for(i = 1; i<= 10;i++) 18 { 19 scanf("%s", leader_name); 20 for(j=0;j<3;j++) 21 if(strcmp(leader_name, leader[j].name) == 0) 22 leader[j].count ++; 23 } 24 printf("\n"); 25 for(i=0;i<3;i++) 26 printf("%5s: %d\n", leader[i].name, leader[i].count); 27 system("pause"); 28 }
二、typedef struct 类型结构体
2.1.利用重命名类型(typedef)说明结构体
typedef:C语言中允许用户自己定义类型说明符,即利用类型定义符typedef为数据类型取别名
一般形式:
typedef 一定义的类型标识符 新标识符;
作用:利用新的标识符代替原来一定义的标识符
例:
typedef int DataType;
第一种 上面第二种用法前面直接加typedef //以下转载
typedef struct student{
char name[20];
int age;
char class;
}student_1;
这语句实际上完成两个操作:
1) 定义一个新的结构类型
struct student{
char name[20];
int age;
char class;
};
2) typedef为这个新的结构起了一个名字,叫student_1。
typedef struct student student_1; (对比typedef int student_1来进行理解)
因此,student_1实际上相当于struct student,这样定义一个变量的时候,既可以用struct student aaa,也可以用student_1 aaa。student_1成了一个数据类型。
如果有逗号,比如
typedef struct student{
char name[20];
int age;
char class;
}student_1,student_2;
可以先理解成
struct student{
char name[20];
int age;
char class;
}student_1;
和
struct student{
char name[20];
int age;
char class;
}student_2;
这样再加上typedef,同上分析,也就是说struct student有两个别名,分别是student_1和student_2,都可以代替struct student定义变量。也就是说有三种用法,struct student aaa;student_1 aaa;student_2 aaa都是等价的。
第二种 上面第三种用法前面直接加typedef
typedef struct {
char name[20];
int age;
char class;
}student_1;
根据唯一性,即定义变量的时候只能是student_1 ;
注意:下面的3种表示形式是等价的
1.结构体变量.成员名
2.(*p).成员名
3.p->成员名 //->指向运算符
附:->是指向运算符
p -> n 得到 p 指向的结构体变量中的成员 n 的值
p -> n ++ 得到 p 指向的结构体变量中的成员 n 的值,用完值后使它加1
++p -> n 得到 p 指向的结构体变量中的成员 n 的值使之加 1 (先加)
三、动态链表所需的函数
(1)分配内存空间函数malloc
函数原型
void * malloc(unsigned int size);
功能:在内存的动态存储区中分配一块长度为size个字节的连续区域,函数的返回值为该区域的起始地址指针。若分配不成功返回NULL.
调用形式:
(<类型说明符>*)malloc (size)
(2)释放内存空间函数free
函数原型:
void free(void * block);
功能:释放block所指向的一块内存空间,block是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc函数多分配的区域。
调用形式:
free(p);//p是指向被释放区域的指针
注意:使用这两个函数需要引用两个头文件stdio.h和alloc.h.