数据结构(c语言)
概要提示:本文将介绍C语言中常见的数据结构,包括数组、链表、栈、队列和树,并解释它们的基本特性和用途。
文章目录
- 数据结构(c语言)
- 前言
- 一、类型简要概括(图例)
- 二、常见数据结构类型(c语言)
- 1. 基本数据类型
- 2. 数组(Array)
- 3. 结构体(Struct)
- 4. 联合体(Union)
- 5. 枚举(Enum)
- 6. 链表(Linked List)
- 7. 指针(Pointer)
- 8. 栈(Stack)
- 线性与非线性数据结构(类型划分)
- 9. 队列(Queue)
- 10. 树(Tree)
- 11. 图(Graph)
- 12. 哈希表(Hash Table)
- 总结
前言
c语言中掌握数据结构的重要性
在C语言中,数据结构不仅是一种存储数据的方式,也是一种处理数据的方法,数据结构在其编程中起着至关重要的作用。下面是一些C语言中常见的数据结构介绍:
一、类型简要概括(图例)
二、常见数据结构类型(c语言)
1. 基本数据类型
- 整型(int):用于存储整数。
- 浮点型(float, double):用于存储小数。
- 字符型(char):用于存储单个字符。
2. 数组(Array)
数组是一种具有相同类型元素的集合,它们在内存中连续存储。数组可以通过索引来访问其元素,索引从0开始。
示例如下(代码):
int arr[4] = {1, 2, 3, 4};//定义一个整型数组,包含4个元素
3. 结构体(Struct)
结构体是一种用户自定义的数据类型,它允许将不同类型的数据组合在一起。
示例如下(代码):
struct Person {
char name[50];
int age;
float weight;
};
struct Person p1 = {"Lily",19,49}
该处模块记录个人的信息(姓名、年龄、体重)
4. 联合体(Union)
联合体与结构体类似,但不同的是,联合体中的所有成员共享同一块内存空间。因此,联合体的大小等于其最大成员的大小。
示例如下(代码):
union Data {
int i;
float f;
char str[20];
};
union Data d1;//定义一个联合体变量
5. 枚举(Enum)
枚举是一种用户定义的类型,它包含一组命名的整数常量。枚举使得代码更加清晰易读。
示例如下(代码):
enum Color {BLUE, BLACK, WHITE};
enum Color c1 = BLACK;//定义一个枚举变量并赋值
6. 链表(Linked List)
链表是一种常见的数据结构,它由一系列节点组成,每个节点都包含数据部分和指向下一个节点的指针。链表允许在任意位置插入和删除元素,而不需要移动其他元素。
示例如下(代码):
struct Node {
int data;
struct Node*next;
};
struct Node*head = NULL;//定义链表头指针并初始化为NULL
7. 指针(Pointer)
指针是C语言中的一种重要数据类型,它存储了变量的内存地址。通过指针,可以直接访问和操作内存中的数据。
示例如下(代码):
int n = 10;
int *p = &n;//p是一个指向n的指针
8. 栈(Stack)
栈是一种遵循后进先出(LIFO)原则的数据结构,它只允许在栈顶进行插入和删除操作。栈通常用于实现函数调用和表达式求值等功能。
线性与非线性数据结构(类型划分)
9. 队列(Queue)
队列是一种先进先出(FIFO)的数据结构,它允许在队尾插入元素,在队头删除元素。队列通常用于实现任务调度和消息传递等功能。
10. 树(Tree)
树是一种非线性数据结构,它由节点和连接节点的边组成。树中的每个节点都包含数据部分和指向其子节点的指针。常见的树结构包括二叉树、平衡二叉树、B树等。
11. 图(Graph)
图是一种复杂的数据结构,它由节点(也称为顶点)和连接节点的边组成。图可以用于表示各种实际问题中的关系网络,如社交网络、交通网络等。
12. 哈希表(Hash Table)
(这一方面较重点,本章这里只是做一个哈希表简要概述,此处附上一位大佬博主的相关讲解链接,可点击这段蓝字跳转进行深入学习)
哈希表是一种基于哈希函数实现的数据结构,它允许在常数时间内进行插入、删除和查找操作。哈希表通常用于实现快速查找和动态集合等功能。
示例如下(代码):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TABLE_SIZE 100 // 哈希表大小
// 哈希表节点结构
typedef struct Entry {
char* key;
int value;
struct Entry* next;
} Entry;
// 哈希表结构
typedef struct HashTable {
Entry* table[TABLE_SIZE];
} HashTable;
// 哈希函数
unsigned int hash(char* key) {
unsigned long hash_value = 0;
int c;
while ((c = *key++)) {
hash_value = c + (hash_value << 6) + (hash_value << 16) - hash_value;
}
return hash_value % TABLE_SIZE;
}
// 创建哈希表
HashTable* create_table() {
HashTable* table = (HashTable*)malloc(sizeof(HashTable));
for (int i = 0; i < TABLE_SIZE; i++) {
table->table[i] = NULL;
}
return table;
}
// 插入键值对
void insert(HashTable* table, char* key, int value) {
unsigned int index = hash(key);
Entry* new_entry = (Entry*)malloc(sizeof(Entry));
new_entry->key = strdup(key);
new_entry->value = value;
new_entry->next = table->table[index];
table->table[index] = new_entry;
}
// 查找值
int search(HashTable* table, char* key) {
unsigned int index = hash(key);
Entry* entry = table->table[index];
while (entry) {
if (strcmp(entry->key, key) == 0) {
return entry->value;
}
entry = entry->next;
}
return -1; // 未找到
}
// 释放哈希表
void free_table(HashTable* table) {
for (int i = 0; i < TABLE_SIZE; i++) {
Entry* entry = table->table[i];
while (entry) {
Entry* temp = entry;
entry = entry->next;
free(temp->key);
free(temp);
}
}
free(table);
}
int main() {
HashTable* table = create_table();
insert(table, "apple", 1);
insert(table, "banana", 2);
insert(table, "orange", 3);
printf("Value for 'apple': %d\n", search(table, "apple"));
printf("Value for 'banana': %d\n", search(table, "banana"));
printf("Value for 'grape' (not found): %d\n", search(table, "grape"));
free_table(table);
return 0;
}
总结
综合以上内容,数据结构是程序设计的基础,这些数据结构在C语言中有着广泛的应用,它们可以根据具体问题的需求进行选择和组合,以实现高效、灵活的算法和程序。