2026最新版 C语言链表与栈操作教程(新手入门+实战技巧)
本教程系统讲解 C 语言中链表与栈的基本原理、创建方法以及操作技巧。文章覆盖单链表、双链表、循环链表以及栈的顺序和链式实现。通过详细代码示例和操作步骤,让新手快速掌握链表和栈的创建、插入、删除、遍历和应用方法,同时适合有一定基础的开发者提升数据结构实战能力。
正文教程
一、链表基础概念
定义:链表是一种线性数据结构,由节点(Node)组成,每个节点包含数据域和指针域,指向下一个节点。
分类:
单链表(Singly Linked List)
双向链表(Doubly Linked List)
循环链表(Circular Linked List)
技巧:理解链表本质是“节点与指针的连接”,是操作栈和队列的基础。
二、C语言单链表实现
步骤:
定义节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
创建链表
Node* createNode(int val){
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = val;
newNode->next = NULL;
return newNode;
}
插入节点(头插法)
void insertHead(Node** head, int val){
Node* newNode = createNode(val);
newNode->next = *head;
*head = newNode;
}
删除节点
void deleteNode(Node** head, int val){
Node *temp = *head, *prev = NULL;
while(temp && temp->data != val){
prev = temp;
temp = temp->next;
}
if(temp == NULL) return;
if(prev == NULL) *head = temp->next;
else prev->next = temp->next;
free(temp);
}
遍历链表
void printList(Node* head){
while(head){
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL ");
}
三、双向链表(Doubly Linked List)实现
节点结构体
typedef struct DNode {
int data;
struct DNode* prev;
struct DNode* next;
} DNode;
插入与删除类似单链表,但需同时维护
prev指针。
技巧:双向链表便于从任意节点双向遍历,提高删除和插入效率。
四、栈基础与操作
定义:栈是一种后进先出(LIFO)的线性数据结构。
实现方式:
顺序栈(数组实现)
链式栈(链表实现)
五、顺序栈实现(数组方式)
#define MAX 100
typedef struct Stack {
int data[MAX];
int top;
} Stack;
void initStack(Stack* s){ s->top = -1; }
int isEmpty(Stack* s){ return s->top == -1; }
int isFull(Stack* s){ return s->top == MAX-1; }
void push(Stack* s, int val){
if(isFull(s)) { printf("Stack Overflow "); return; }
s->data[++s->top] = val;
}
int pop(Stack* s){
if(isEmpty(s)) { printf("Stack Underflow "); return -1; }
return s->data[s->top--];
}
六、链式栈实现(链表方式)
typedef struct StackNode {
int data;
struct StackNode* next;
} StackNode;
StackNode* top = NULL;
void pushNode(int val){
StackNode* newNode = (StackNode*)malloc(sizeof(StackNode));
newNode->data = val;
newNode->next = top;
top = newNode;
}
int popNode(){
if(top == NULL) { printf("Stack Empty "); return -1; }
int val = top->data;
StackNode* temp = top;
top = top->next;
free(temp);
return val;
}
技巧:链式栈避免数组固定大小限制,适合动态场景。
七、链表与栈实战应用
括号匹配:利用栈检查括号是否平衡
表达式求值:中缀转后缀表达式并计算结果
链表反转:利用栈临时存储节点,实现链表逆序
八、总结
通过本教程,你可以:
系统掌握 C 语言链表和栈的实现原理
熟练进行插入、删除、遍历、栈操作
应用链表和栈解决实际开发问题
为数据结构和算法进阶打下坚实基础