前言
-
什么是
数据结构
?
数据结构(Data Structure)是指相互之间存在一种或多种特定关系的数据元素
集合,数据结构由数据元素
和关系
组成。 -
什么是
数据元素
?
数据元素(Data Element)是组成数据
的基本单位。 -
什么是
数据
?
数据(Data)是描述客观事物的集合,可以是模拟数据,如:图像、声音等;也可以是数字数据,如:字符、数字等。 -
结构体是数据结构在C语言中的表现形式,不同数据类型组成的组合型的数据结构
声明结构体
使用struct
关键字定义结构体
struct 结构体名 //结构体类型:struct + 结构体名
{成员列表};
例如:定义一个学生类型的结构体,学生的姓名、年龄等就是结构体的成员。
struct Student
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
};
结构体成员的定义和定义变量一样。
定义结构体类型变量
- 先声明结构体类型,再单独定义结构体变量(如定义一个学生xiaoming)
struct Student xiaoqiang;
即:结构体类型 结构体变量名
- 声明结构体变量的同时,定义结构体变量
struct Student
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
}xiaoqiang;
即:
struct 结构体名
{
成员列表;
}结构体变量名;
- 不指定类型名定义结构体
struct
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
}xiaoqiang;
即:
struct
{
成员列表;
}结构体变量名;
- 使用
typedef
使用一个新的类型名代表结构体类型
typedef struct
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
}Std;
Std xiaoqiang; //定义一个结构体变量
效果等同
typedef struct Student
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
}Std;
Std xiaoqiang; //定义一个结构体变量
即:
typedef struct 结构体类型名(可以省略)
{
成员列表;
}新的类型名;
定义结构体数组
struct Student
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
}Std[2]={"小强",18,"小董",17};
即:
struct 结构体名
{成员列表}数组名[数组长度];
初始化:
- 声明结构体类型时初始化;
- 先声明结构体类型,再初始化。
初始结构体成员
- 定义结构体变量的同时初始化
struct
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
}xiaoqiang={"小强",18};
- 引用结构体变量进行初始化(通过
结构体变量名.成员名
来引用结构体成员)
struct
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
}xiaoqiang;
int main(){
strcpy(xiaoqiang.name,"小强");
xiaoqiang.age=18;
printf("%s今年%d\n",xiaoqiang.name,xiaoqiang.age);
return 0;
}
结构体指针
定义一个结构体指针
struct Student
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
}* std;
效果等同
struct Student
{
char name[30]; //字符数组来存储姓名
int age; //学生年龄
};
Student* std;
指针std指向Student结构体,引用结构体成员:
1. (* std).成员名,如:(* std).age;
2. std->成员名,如:std->age;
注:使用typedef定义一个新的结构体指针类型,定义结构体指针变量后,需要使用malloc函数为其分配空间,才能应用结构体中的成员。
例如:
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int elem[10];
int HighPower;
}Node,* NodeList;
int main()
{
NodeList a;
printf("%d",a->elem[0]);
return 0;
}
NodeList 为野指针,如果不使用malloc函数为其分配空间,则会导致程序异常结束。