C10 C语言数据结构
目录
- 枚举
- 结构体
- 共用体
枚举
enum
enum枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。
枚举语法定义格式为:
enum 枚举名 {枚举元素1,枚举元素2,……};
枚举类型的定义
第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。也可以手动指定每个枚举成员的值。
示例:
#include <stdio.h> //定义枚举类型WEEKDAY enum WEEKDAY{ MON=1, TUE, WED, THU, FRI, SAT, SUN }; int main () { return 0; }
枚举变量的定义
枚举变量的定义有三种方式:
1、先定义枚举类型,再定义枚举变量
enum WEEKDAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; enum WEEKDAY day;
2、定义枚举类型的同时定义枚举变量
enum WEEKDAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
3、省略枚举名称,直接定义枚举变量
enum { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
使用枚举变量示例代码:
#include <stdio.h> int main () { //定义枚举类型WEEKDAY enum WEEKDAY{ MON=1, TUE, WED, THU, FRI, SAT, SUN }; //定义枚举变量day enum WEEKDAY day; day=WED; printf("%d\n",day); return 0; }
在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。
示例代码,编译报错:
#include <stdio.h> int main () { //定义枚举类型WEEKDAY enum WEEKDAY{ MON=1, TUE, WED, THU, FRI, SAT, SUN }; //定义枚举变量day enum WEEKDAY day; // 遍历枚举元素 for (day = MON; day <= SUN; day++) { printf("枚举元素:%d \n", day); } return 0; }
结构体
概念
结构体支持用户自定义和存储可用数据类型的数据集合。
类似数组,但是数组只能存储相同类型的数据。
结构体的定义
语法格式:
struct tag { member-list member-list member-list ... } variable-list ;
tag 是结构体标签。
member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。
例如:定义一个学生信息结构体
#include <stdio.h> //学生信息结构体 struct Student{ int id;//学号 char name[20];//姓名 int age;//年龄 char gender[2];//性别 char classes[20];//班级 }; int main () { return 0; }
结构体变量的定义和访问
为了访问结构的成员,我们使用成员访问运算符(.)。
示例代码:
#include <stdio.h> #include <string.h> //学生信息结构体 struct Student{ int id;//学号 char name[20];//姓名 int age;//年龄 char gender[2];//性别 char classes[20];//班级 }; #include <stdio.h> int main( ) { struct Student zs; /* 声明 zs,类型为 Student */ struct Student ls; /* 声明 ls,类型为 Student */ /* zs 初始化 */ zs.id=2016001; strcpy( zs.name, "张三"); zs.age=21; strcpy( zs.gender, "男"); strcpy( zs.classes, "软件工程1班"); /* ls 初始化 */ //ls.id=2016002; //ls.name="李四";//错误:cannot convert from 'char [5]' to 'char [20]' //ls.age=21; //ls.gender="女";//错误:cannot convert from 'char [3]' to 'char [2]' //ls.classes="软件工程1班";//错误:cannot convert from 'char [12]' to 'char [20]' ls.id=2016002; strcpy( ls.name, "李四"); ls.age=21; strcpy( ls.gender, "女"); strcpy( ls.classes, "软件工程1班"); /* 输出 zs信息 */ printf( "学号: %d\n", zs.id); printf( "姓名: %s\n", zs.name); printf( "年龄: %d\n", zs.age); printf( "性别: %s\n", zs.gender); printf( "班级: %s\n",zs.classes); /* 输出 ls 信息 */ printf( "学号: %d\n", ls.id); printf( "姓名: %s\n", ls.name); printf( "年龄: %d\n", ls.age); printf( "性别: %s\n", ls.gender); printf( "班级: %s\n",ls.classes); return 0; }
备注:strcpy把含有'\0'结束符的字符串复制到数组中,会逐个字符进行拷贝。“=”赋值必须保证字符串长度和字符数组长度一致,否则将会导致转换错误。
字符串和数组长度定义的关系:c语言中的字符串是使用字符数组存储的,含有'\0'作为结束符号。因此定义数组长度的时候需要考虑'\0'元素,例如:
char arr[4]="abc";
输出效果:
结构体数组
可以使用结构体数组来存储结构体,方便数据的操作。
示例代码:
#include <stdio.h> #include <string.h> //学生信息结构体 struct Student{ int id;//学号 char name[20];//姓名 int age;//年龄 char gender[2];//性别 char classes[20];//班级 }; #include <stdio.h> int main( ) { struct Student stus[3];//定义结构体数组 struct Student zs; /* 声明 zs,类型为 Student */ struct Student ls; /* 声明 ls,类型为 Student */ struct Student ww; /* 声明 ww,类型为 Student */ /* zs 初始化 */ zs.id=2016001; strcpy( zs.name, "张三"); zs.age=21; strcpy( zs.gender, "男"); strcpy( zs.classes, "软件工程1班"); /* ls 初始化 */ ls.id=2016002; strcpy( ls.name, "李四"); ls.age=18; strcpy( ls.gender, "女"); strcpy( ls.classes, "软件工程2班"); /* ww 初始化 */ ww.id=2016048; strcpy( ww.name, "王五"); ww.age=23; strcpy( ww.gender, "男"); strcpy( ww.classes, "软件工程3班"); //结构体数组初始化 stus[0]=zs; stus[1]=ls; stus[2]=ww; for(int i=0;i<3;i++){ /* 输出学生列表信息 */ printf( "学号: %d\t姓名: %s\t班级: %s\n", stus[i].id,stus[i].name,stus[i].classes); } return 0; }
输出:
共用体
共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。如何实现?
定义共用体
语法格式:
union [union tag] { member definition; member definition; ... member definition; } [one or more union variables];
例如:
union Data { int i; float f; char str[20]; } data;
说明:
- Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。即着一个变量 data(相同的内存位置)可以存储多个多种类型的数据。
- 支持在一个共用体内使用任何内置的或者用户自定义的数据类型。
- 共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。可以使用sizeof()检测。
例如:
#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; printf( "Memory size occupied by data : %d\n", sizeof(data)); return 0; }
共用体访问
使用成员访问运算符(.)
示例1:共用体的错误用法
#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; data.i = 10; data.f = 220.5; strcpy( data.str, "abcdabcd"); printf( "data.i : %d\n", data.i); printf( "data.f : %f\n", data.f); printf( "data.str : %s\n", data.str); return 0; }
共用体data存放数据的顺序不同,导致i和f输出信息错误,而最后输入的str值则正确。说明了i,f,str共用一段长度为20个字节的内容。
示例2:共用体的正确用法
#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; data.i = 10; printf( "data.i : %d\n", data.i); data.f = 220.5; printf( "data.f : %f\n", data.f); strcpy( data.str, "C Programming"); printf( "data.str : %s\n", data.str); return 0; }
正确用法是依次访问某种类型的数据。确保在同一时间只使用一个变量,这也是union数据类型定义的目的。
本博客文章未经许可,禁止转载和商业用途!
如有疑问,请联系: 2083967667@qq.com