新闻中心

2026最新版 C语言链表与栈操作教程(新手入门+实战技巧)

栏目:软件教程 日期: 作者:admin 阅读:11

本教程系统讲解 C 语言中链表与栈的基本原理、创建方法以及操作技巧。文章覆盖单链表、双链表、循环链表以及栈的顺序和链式实现。通过详细代码示例和操作步骤,让新手快速掌握链表和栈的创建、插入、删除、遍历和应用方法,同时适合有一定基础的开发者提升数据结构实战能力。

正文教程

一、链表基础概念

  1. 定义:链表是一种线性数据结构,由节点(Node)组成,每个节点包含数据域和指针域,指向下一个节点。

  2. 分类

    • 单链表(Singly Linked List)

    • 双向链表(Doubly Linked List)

    • 循环链表(Circular Linked List)

技巧:理解链表本质是“节点与指针的连接”,是操作栈和队列的基础。


二、C语言单链表实现

步骤

  1. 定义节点结构体

typedef struct Node {
   int data;
   struct Node* next;
} Node;

  1. 创建链表

Node* createNode(int val){
   Node* newNode = (Node*)malloc(sizeof(Node));
   newNode->data = val;
   newNode->next = NULL;
   return newNode;
}

  1. 插入节点(头插法)

void insertHead(Node** head, int val){
   Node* newNode = createNode(val);
   newNode->next = *head;
   *head = newNode;
}

  1. 删除节点

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);
}

  1. 遍历链表

void printList(Node* head){
   while(head){
       printf("%d -> ", head->data);
       head = head->next;
   }
   printf("NULL ");
}


三、双向链表(Doubly Linked List)实现

  1. 节点结构体

typedef struct DNode {
   int data;
   struct DNode* prev;
   struct DNode* next;
} DNode;

  1. 插入与删除类似单链表,但需同时维护 prev 指针。

技巧:双向链表便于从任意节点双向遍历,提高删除和插入效率。


四、栈基础与操作

  1. 定义:栈是一种后进先出(LIFO)的线性数据结构。

  2. 实现方式

    • 顺序栈(数组实现)

    • 链式栈(链表实现)


五、顺序栈实现(数组方式)

#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;
}

技巧:链式栈避免数组固定大小限制,适合动态场景。


七、链表与栈实战应用

  1. 括号匹配:利用栈检查括号是否平衡

  2. 表达式求值:中缀转后缀表达式并计算结果

  3. 链表反转:利用栈临时存储节点,实现链表逆序


八、总结

通过本教程,你可以:

  • 系统掌握 C 语言链表和栈的实现原理

  • 熟练进行插入、删除、遍历、栈操作

  • 应用链表和栈解决实际开发问题

  • 为数据结构和算法进阶打下坚实基础

相关资讯