首页 > 技术文章 > C10 C语言数据结构

rask 2018-12-27 11:13 原文

目录

  • 枚举
  • 结构体
  • 共用体

 

枚举

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;

  

说明:

  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\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数据类型定义的目的。

推荐阅读