c语言数据结构笔记(数据结构c语言版必背)
# C语言数据结构笔记## 简介 C语言作为一种高效且灵活的编程语言,是学习数据结构的基础工具。数据结构是计算机科学的重要分支,它研究数据在计算机中的存储、组织和操作方式。通过合理地设计数据结构,可以优化算法性能,提高程序运行效率。本文将从基础概念入手,结合C语言的特点,详细介绍链表、栈、队列等常用数据结构的实现与应用。---## 一、数据结构的基本概念 ### 1. 数据结构的分类 数据结构可分为两大类: -
线性结构
:如数组、链表、栈、队列等,数据元素按线性顺序排列。 -
非线性结构
:如树、图等,数据元素之间的关系不是简单的线性关系。 ### 2. 数据结构的核心目标 数据结构的主要目标包括: - 提高数据处理速度。 - 节省存储空间。 - 实现复杂算法的基础支持。---## 二、链表 链表是一种常见的线性数据结构,其特点是每个节点包含数据部分和指向下一个节点的指针。相比于数组,链表具有动态扩展的优点。### 1. 链表的分类 - 单向链表(Singly Linked List):每个节点只有一个指向下一个节点的指针。 - 双向链表(Doubly Linked List):每个节点有两个指针,分别指向前后两个节点。 - 循环链表(Circular Linked List):最后一个节点指向第一个节点,形成一个闭环。### 2. 单向链表的实现 #### 定义链表节点结构 ```c typedef struct Node {int data; // 数据域struct Node
next; // 指针域 } Node; ```#### 创建链表节点 ```c Node
createNode(int value) {Node
newNode = (Node
)malloc(sizeof(Node));if (newNode == NULL) {printf("Memory allocation failed!\n");exit(1);}newNode->data = value;newNode->next = NULL;return newNode; } ```#### 插入节点到链表尾部 ```c void append(Node
head, int value) {Node
newNode = createNode(value);if (
head == NULL) {
head = newNode;} else {Node
temp =
head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;} } ```---## 三、栈 栈是一种后进先出(LIFO, Last In First Out)的数据结构,常用于函数调用管理、表达式求值等场景。### 1. 栈的基本操作 - 入栈(Push):将元素添加到栈顶。 - 出栈(Pop):移除栈顶元素并返回其值。 - 查看栈顶(Peek/Top):查看栈顶元素但不移除。### 2. 栈的实现 #### 使用数组实现栈 ```c #define MAX_SIZE 100 int stack[MAX_SIZE]; int top = -1;void push(int value) {if (top >= MAX_SIZE - 1) {printf("Stack overflow!\n");return;}stack[++top] = value; }int pop() {if (top < 0) {printf("Stack underflow!\n");return -1;}return stack[top--]; }int peek() {if (top < 0) {printf("Stack is empty!\n");return -1;}return stack[top]; } ```---## 四、队列 队列是一种先进先出(FIFO, First In First Out)的数据结构,广泛应用于任务调度、消息传递等领域。### 1. 队列的基本操作 - 入队(Enqueue):将元素添加到队列尾部。 - 出队(Dequeue):移除队列头部的元素。 - 查看队头(Front):查看队列头部的元素但不移除。### 2. 队列的实现 #### 使用数组实现循环队列 ```c #define MAX_SIZE 100 int queue[MAX_SIZE]; int front = 0, rear = 0;void enqueue(int value) {if ((rear + 1) % MAX_SIZE == front) {printf("Queue overflow!\n");return;}queue[rear] = value;rear = (rear + 1) % MAX_SIZE; }int dequeue() {if (front == rear) {printf("Queue underflow!\n");return -1;}int removed = queue[front];front = (front + 1) % MAX_SIZE;return removed; } ```---## 五、总结 本文介绍了C语言中几种常用的数据结构,包括链表、栈和队列,并给出了其实现代码。数据结构的学习不仅需要理论知识,还需要通过实践加深理解。通过掌握这些基础数据结构,我们可以为后续学习更复杂的算法打下坚实的基础。希望本文能帮助读者更好地理解和应用C语言中的数据结构!
C语言数据结构笔记
简介 C语言作为一种高效且灵活的编程语言,是学习数据结构的基础工具。数据结构是计算机科学的重要分支,它研究数据在计算机中的存储、组织和操作方式。通过合理地设计数据结构,可以优化算法性能,提高程序运行效率。本文将从基础概念入手,结合C语言的特点,详细介绍链表、栈、队列等常用数据结构的实现与应用。---
一、数据结构的基本概念
1. 数据结构的分类 数据结构可分为两大类: - **线性结构**:如数组、链表、栈、队列等,数据元素按线性顺序排列。 - **非线性结构**:如树、图等,数据元素之间的关系不是简单的线性关系。
2. 数据结构的核心目标 数据结构的主要目标包括: - 提高数据处理速度。 - 节省存储空间。 - 实现复杂算法的基础支持。---
二、链表 链表是一种常见的线性数据结构,其特点是每个节点包含数据部分和指向下一个节点的指针。相比于数组,链表具有动态扩展的优点。
1. 链表的分类 - 单向链表(Singly Linked List):每个节点只有一个指向下一个节点的指针。 - 双向链表(Doubly Linked List):每个节点有两个指针,分别指向前后两个节点。 - 循环链表(Circular Linked List):最后一个节点指向第一个节点,形成一个闭环。
2. 单向链表的实现
定义链表节点结构 ```c typedef struct Node {int data; // 数据域struct Node* next; // 指针域 } Node; ```
创建链表节点 ```c Node* createNode(int value) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("Memory allocation failed!\n");exit(1);}newNode->data = value;newNode->next = NULL;return newNode; } ```
插入节点到链表尾部 ```c void append(Node** head, int value) {Node* newNode = createNode(value);if (*head == NULL) {*head = newNode;} else {Node* temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;} } ```---
三、栈 栈是一种后进先出(LIFO, Last In First Out)的数据结构,常用于函数调用管理、表达式求值等场景。
1. 栈的基本操作 - 入栈(Push):将元素添加到栈顶。 - 出栈(Pop):移除栈顶元素并返回其值。 - 查看栈顶(Peek/Top):查看栈顶元素但不移除。
2. 栈的实现
使用数组实现栈 ```c
define MAX_SIZE 100 int stack[MAX_SIZE]; int top = -1;void push(int value) {if (top >= MAX_SIZE - 1) {printf("Stack overflow!\n");return;}stack[++top] = value; }int pop() {if (top < 0) {printf("Stack underflow!\n");return -1;}return stack[top--]; }int peek() {if (top < 0) {printf("Stack is empty!\n");return -1;}return stack[top]; } ```---
四、队列 队列是一种先进先出(FIFO, First In First Out)的数据结构,广泛应用于任务调度、消息传递等领域。
1. 队列的基本操作 - 入队(Enqueue):将元素添加到队列尾部。 - 出队(Dequeue):移除队列头部的元素。 - 查看队头(Front):查看队列头部的元素但不移除。
2. 队列的实现
使用数组实现循环队列 ```c
define MAX_SIZE 100 int queue[MAX_SIZE]; int front = 0, rear = 0;void enqueue(int value) {if ((rear + 1) % MAX_SIZE == front) {printf("Queue overflow!\n");return;}queue[rear] = value;rear = (rear + 1) % MAX_SIZE; }int dequeue() {if (front == rear) {printf("Queue underflow!\n");return -1;}int removed = queue[front];front = (front + 1) % MAX_SIZE;return removed; } ```---
五、总结 本文介绍了C语言中几种常用的数据结构,包括链表、栈和队列,并给出了其实现代码。数据结构的学习不仅需要理论知识,还需要通过实践加深理解。通过掌握这些基础数据结构,我们可以为后续学习更复杂的算法打下坚实的基础。希望本文能帮助读者更好地理解和应用C语言中的数据结构!