跳到主要内容

C 语言自定义数据结构

介绍

在C语言中,数据结构是组织和存储数据的方式。虽然C语言提供了基本的数据类型(如 intfloatchar 等),但在实际编程中,我们经常需要将多个相关的数据组合在一起,形成更复杂的数据结构。这时,自定义数据结构就派上了用场。

C语言中的自定义数据结构主要包括以下三种:

  1. 结构体(Struct):用于将不同类型的数据组合在一起。
  2. 联合体(Union):允许在同一内存位置存储不同的数据类型。
  3. 枚举类型(Enum):用于定义一组命名的整数常量。

本文将逐步讲解这些概念,并通过代码示例和实际案例帮助你理解它们的应用。


结构体(Struct)

结构体是C语言中最常用的自定义数据结构。它允许你将多个不同类型的数据组合在一起,形成一个新的数据类型。

定义结构体

c
struct Person {
char name[50];
int age;
float height;
};

在这个例子中,我们定义了一个名为 Person 的结构体,它包含三个成员:name(字符数组)、age(整数)和 height(浮点数)。

使用结构体

定义结构体后,我们可以声明结构体变量并访问其成员:

c
#include <stdio.h>

struct Person {
char name[50];
int age;
float height;
};

int main() {
struct Person person1;
strcpy(person1.name, "Alice");
person1.age = 25;
person1.height = 1.68;

printf("Name: %s\n", person1.name);
printf("Age: %d\n", person1.age);
printf("Height: %.2f\n", person1.height);

return 0;
}

输出:

Name: Alice
Age: 25
Height: 1.68
提示

你可以使用 typedef 关键字为结构体定义一个别名,从而简化代码:

c
typedef struct {
char name[50];
int age;
float height;
} Person;

这样,你可以直接使用 Person 来声明变量,而不需要每次都写 struct Person


联合体(Union)

联合体与结构体类似,但它的所有成员共享同一块内存空间。这意味着联合体的大小等于其最大成员的大小。

定义联合体

c
union Data {
int i;
float f;
char str[20];
};

在这个例子中,Data 联合体包含三个成员:i(整数)、f(浮点数)和 str(字符数组)。它们共享同一块内存。

使用联合体

c
#include <stdio.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 = 3.14;
printf("data.f: %.2f\n", data.f);

strcpy(data.str, "Hello");
printf("data.str: %s\n", data.str);

return 0;
}

输出:

data.i: 10
data.f: 3.14
data.str: Hello
警告

联合体的成员共享内存,因此修改一个成员的值可能会影响其他成员的值。在使用联合体时,请确保你清楚地知道当前存储的是哪个成员。


枚举类型(Enum)

枚举类型用于定义一组命名的整数常量。它可以使代码更具可读性。

定义枚举类型

c
enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};

在这个例子中,Weekday 枚举类型定义了一周的七天,每个枚举常量默认从0开始递增。

使用枚举类型

c
#include <stdio.h>

enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};

int main() {
enum Weekday today = Wednesday;
printf("Today is day number: %d\n", today);

return 0;
}

输出:

Today is day number: 2
备注

你可以为枚举常量显式赋值:

c
enum Weekday {
Monday = 1,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};

这样,Monday 的值为1,Tuesday 的值为2,依此类推。


实际案例:学生管理系统

让我们通过一个实际案例来展示自定义数据结构的应用。假设我们需要实现一个简单的学生管理系统,存储学生的姓名、年龄和成绩。

c
#include <stdio.h>
#include <string.h>

typedef struct {
char name[50];
int age;
float score;
} Student;

void printStudent(Student s) {
printf("Name: %s\n", s.name);
printf("Age: %d\n", s.age);
printf("Score: %.2f\n", s.score);
}

int main() {
Student student1;
strcpy(student1.name, "Bob");
student1.age = 20;
student1.score = 88.5;

printStudent(student1);

return 0;
}

输出:

Name: Bob
Age: 20
Score: 88.50

在这个案例中,我们使用结构体 Student 来存储学生的信息,并通过函数 printStudent 打印学生的详细信息。


总结

C语言中的自定义数据结构(结构体、联合体和枚举类型)为我们提供了强大的工具来组织和操作复杂的数据。通过本文的学习,你应该已经掌握了如何定义和使用这些数据结构。

附加资源

练习

  1. 定义一个结构体 Book,包含书名、作者和价格。编写一个程序,输入并打印一本书的信息。
  2. 使用联合体实现一个程序,允许用户输入一个整数或浮点数,并打印其值。
  3. 定义一个枚举类型 Color,包含红、绿、蓝三种颜色。编写一个程序,根据用户输入的颜色打印相应的颜色名称。

希望本文对你理解C语言自定义数据结构有所帮助!继续加油学习吧!