1. C语言结构体的概述
在C语言中,结构体(struct)是一种复合数据类型,用于将不同类型的数据组合在一起。它可以包含基本数据类型(如 int、float、char 等)以及其他结构体。结构体非常适合表示具有多种属性的复杂数据,如学生信息(包含姓名、年龄、成绩等)或坐标点(包含 x 和 y 坐标)。
结构体的定义使用关键字 struct,可以在函数之外(全局)或函数内部定义。全局定义的结构体可以在程序的任何地方使用,而局部定义的结构体仅限于函数内部。
2. 定义结构体变量类型的方法
定义结构体类型的一般形式如下:
struct 结构体名 {
数据类型1 成员名1;
数据类型2 成员名2;
// 更多成员
};
例如,定义一个表示学生信息的结构体类型:
struct Student {
int id;
char name[50];
float grade;
};
在这个结构体中,有三个成员:id(整数类型),name(字符数组类型,用于存储学生姓名),和 grade(浮点数类型,表示成绩)。
3. 结构体变量的引用
定义好结构体类型后,可以声明结构体变量来存储数据。结构体变量的声明方式类似于基本数据类型:
struct Student student1;
可以通过点运算符 . 来访问结构体的成员:
student1.id = 1;
strcpy(student1.name, "Alice");
student1.grade = 89.5;
在这个例子中,我们设置了 student1 的 id 为 1,name 为 "Alice",grade 为 89.5。
4. 结构体变量的初始化
结构体变量可以在声明时初始化:
struct Student student1 = {1, "Alice", 89.5};
此初始化方式按照成员声明的顺序依次赋值。此外,也可以使用指定初始化:
struct Student student1 = {.name = "Alice", .id = 1, .grade = 89.5};
指定初始化使代码更具可读性和灵活性,尤其是在结构体成员较多时。
5. 结构体数组
结构体数组用于存储多个相同类型的结构体变量,是一种便捷的数据组织方式。例如,定义一个学生数组来存储多个学生的信息:
struct Student students[3] = {
{1, "Alice", 89.5},
{2, "Bob", 78.9},
{3, "Charlie", 92.3}
};
可以使用数组下标来访问和操作这些结构体:
printf("First student: %s\n", students[0].name);
students[1].grade = 85.0;
6. 指向结构体数据类型的指针
和其他数据类型一样,C 语言允许使用指针指向结构体。指针不仅可以节省内存,而且可以方便地传递大型结构体作为参数。
定义结构体指针并访问成员的一般形式如下:
struct Student *ptr;
ptr = &student1;
// 使用箭头运算符 -> 访问成员
printf("ID: %d\n", ptr->id);
这里 ptr 是一个指向 Student 结构体的指针。使用箭头运算符 -> 可以访问指针指向的结构体成员。
7. 用指针处理链表
链表是一种动态数据结构,其中的元素被称为节点。每个节点包含数据和一个指向下一个节点的指针。链表通过指针实现灵活的内存使用,可以动态增删节点。链表有多种类型,如单向链表、双向链表和循环链表。
7.1 单向链表示例
单向链表中的每个节点包含数据和一个指向下一个节点的指针。链表通常有一个头指针指向第一个节点。
节点的结构定义:
struct Node {
int data;
struct Node* next;
};
创建链表并插入节点:
struct Node* head = NULL; // 初始化链表为空
void push_front(struct Node** head_ref, int new_data) {
struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
if (new_node == NULL) {
fprintf(stderr, "Memory allocation failed\n");
return;
}
new_node->data = new_data;
new_node->next = *head_ref;
*head_ref = new_node;
}
push_front(&head, 10);
push_front(&head, 20);
push_front(&head, 30);
在这个例子中,push_front 函数在链表的头部插入新节点。head_ref 是指向头指针的指针,这使得可以直接修改头指针。
7.2 遍历和操作链表
可以通过遍历链表来访问和操作节点数据:
void print_list(struct Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
print_list(head); // 输出:30 20 10
7.3 删除链表
删除链表时,需要释放所有节点的内存,以防止内存泄漏:
void free_list(struct Node* head) {
struct Node* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
free_list(head);
标签:Node,head,struct,链表,结构,变量,指针 From: https://blog.csdn.net/lexc_/article/details/140853636