zoukankan      html  css  js  c++  java
  • 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
    ",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 
    ", 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
    ", zs.id);
    	printf( "姓名: %s
    ", zs.name);
    	printf( "年龄: %d
    ", zs.age);
    	printf( "性别: %s
    ", zs.gender);
    	printf( "班级: %s
    ",zs.classes);
    	
    	/* 输出 ls 信息 */
    	printf( "学号: %d
    ", ls.id);
    	printf( "姓名: %s
    ", ls.name);
    	printf( "年龄: %d
    ", ls.age);
    	printf( "性别: %s
    ", ls.gender);
    	printf( "班级: %s
    ",ls.classes);
    	
    	return 0;
    }
    

      

      

    备注:strcpy把含有''结束符的字符串复制到数组中,会逐个字符进行拷贝。“=”赋值必须保证字符串长度和字符数组长度一致,否则将会导致转换错误。

    字符串和数组长度定义的关系:c语言中的字符串是使用字符数组存储的,含有''作为结束符号。因此定义数组长度的时候需要考虑''元素,例如:

    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	姓名: %s	班级: %s
    ", 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;
    

      

    说明:

    1. Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。即着一个变量 data(相同的内存位置)可以存储多个多种类型的数据。
    2. 支持在一个共用体内使用任何内置的或者用户自定义的数据类型。
    3. 共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,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
    ", 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
    ", data.i);
       printf( "data.f : %f
    ", data.f);
       printf( "data.str : %s
    ", 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
    ", data.i);
       
       data.f = 220.5;
       printf( "data.f : %f
    ", data.f);
       
       strcpy( data.str, "C Programming");
       printf( "data.str : %s
    ", data.str);
     
       return 0;
    }
    

      

    正确用法是依次访问某种类型的数据。确保在同一时间只使用一个变量,这也是union数据类型定义的目的。

  • 相关阅读:
    python实用库:PrettyTable 学习
    centos启动错误:Inodes that were part of a corrupted orphan linked list found.
    C++:in namespace 'std' does not name a template type
    小程序实现单词查询搜索及搜索的历史记录
    小程序图片懒加载较完美解决方案
    下载文件到本地解压压缩包出现文件损坏,报错问题已解决
    彻底理解cookie,session,token
    vue全家桶(Vue+Vue-router+Vuex+axios)(Vue+webpack项目实战系列之二)
    与关系型数据库相比,MongoDB的优缺点
    漫谈JS 的继承方式
  • 原文地址:https://www.cnblogs.com/rask/p/10185638.html
Copyright © 2011-2022 走看看