学习 C 语言数据结构是计算机科学和软件开发的基础之一。以下是一个详细的C 语言数据结构学习大纲,从基础概念到高级数据结构,帮助你系统性掌握数据结构,并通过 C 语言实现。
malloc()
、free()
)malloc()
分配动态数组)push()
、pop()
、peek()
)enqueue()
、dequeue()
)章节 | 主题 | 主要内容 |
---|---|---|
第一部分 | 数据结构基础 | 存储方式、指针、时间复杂度 |
第二部分 | 线性数据结构 | 数组、链表、栈、队列 |
第三部分 | 非线性数据结构 | 树、图 |
第四部分 | 高级数据结构 | 哈希表、跳表、Trie 树 |
第五部分 | 数据结构与算法 | 排序、查找、动态规划 |
第六部分 | 工程应用 | 操作系统、数据库、人工智能 |
通过系统学习,你将能够高效处理数据,提高代码性能,解决复杂问题,并在面试和工程实践中脱颖而出!
在前面的学习大纲中,我们系统地介绍了C 语言数据结构的各个方面。接下来,我们将深入探讨数据结构的实际应用、性能优化、工程实践,并通过C 语言实例演示高级技术,包括内存管理、数据结构优化、并行计算、工程级数据结构设计等。
在 C 语言中,数据结构通常需要动态分配内存,以提高灵活性和效率。
#include
#include
int main() {
int n;
printf("输入数组大小: ");
scanf("%d", &n);
// 使用 malloc 分配动态数组
int* arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
printf("内存分配失败!\n");
return -1;
}
// 初始化数组
for (int i = 0; i < n; i++) {
arr[i] = i * 10;
}
// 输出数组
printf("数组内容: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 释放内存
free(arr);
return 0;
}
malloc()
分配动态数组,避免固定大小的限制。free()
释放内存,防止内存泄漏(memory leak)。在工程级应用中,数据结构的内存占用至关重要。优化方法包括:
struct
结构体减少内存占用。#include
#include
#pragma pack(1) // 让结构体按 1 字节对齐,减少内存浪费
typedef struct {
char type; // 1 字节
int id; // 4 字节
short value; // 2 字节
} CompactStruct;
int main() {
printf("结构体大小: %lu 字节\n", sizeof(CompactStruct));
return 0;
}
#pragma pack(1)
让结构体按 1 字节对齐,减少内存填充(padding)。优化链表的方式:
malloc()
调用次数。#include
#include
// 定义双向循环链表节点
typedef struct Node {
int data;
struct Node* next;
struct Node* prev;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = newNode;
newNode->prev = newNode;
return newNode;
}
// 插入节点
void insert(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
Node* tail = (*head)->prev;
tail->next = newNode;
newNode->prev = tail;
newNode->next = *head;
(*head)->prev = newNode;
}
}
// 遍历链表
void printList(Node* head) {
if (head == NULL) return;
Node* temp = head;
do {
printf("%d -> ", temp->data);
temp = temp->next;
} while (temp != head);
printf("循环回到头部\n");
}
int main() {
Node* head = NULL;
insert(&head, 10);
insert(&head, 20);
insert(&head, 30);
printList(head);
return 0;
}
在大规模数据处理时,可以使用多线程并行处理数据结构。
#include
#include
#define SIZE 100
#define THREAD_COUNT 4
int arr[SIZE];
int sum[THREAD_COUNT] = {0}; // 每个线程计算的部分和
void* sumArray(void* arg) {
int thread_id = *(int*)arg;
int start = thread_id * (SIZE / THREAD_COUNT);
int end = start + (SIZE / THREAD_COUNT);
for (int i = start; i < end; i++) {
sum[thread_id] += arr[i];
}
return NULL;
}
int main() {
// 初始化数组
for (int i = 0; i < SIZE; i++) {
arr[i] = i + 1;
}
pthread_t threads[THREAD_COUNT];
int thread_ids[THREAD_COUNT];
// 创建线程
for (int i = 0; i < THREAD_COUNT; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, sumArray, &thread_ids[i]);
}
// 等待线程完成
for (int i = 0; i < THREAD_COUNT; i++) {
pthread_join(threads[i], NULL);
}
// 计算最终和
int total_sum = 0;
for (int i = 0; i < THREAD_COUNT; i++) {
total_sum += sum[i];
}
printf("数组元素总和: %d\n", total_sum);
return 0;
}
pthread_create()
创建线程,并行计算数组的部分和,提高计算效率。优化方式 | 技术 | 应用场景 |
---|---|---|
内存优化 | 结构体优化、对象池 | 嵌入式系统、大规模数据存储 |
链表优化 | 双向循环链表 | 任务调度、缓存管理 |
并行计算 | 多线程、CUDA | 大数据处理、人工智能 |
工程级数据结构 | B+ 树、Trie 树、哈希表 | 数据库、搜索引擎 |
掌握数据结构不仅仅是学习概念,更重要的是如何在工程实践中优化和应用它们!