当前位置: 首页 > ds >正文

C语言中常见的数据结构及其代码实现

C语言中常见的数据结构及其代码实现

       摘要:以下是C语言中常见的数据结构及其实现代码,包括队列、堆栈、单链表、双链表和二叉树。每种数据结构都包括基本的操作,如插入、删除等。

1. 队列 (Queue)

队列是一种先进先出 (FIFO) 的数据结构。

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 10typedef struct {int items[MAX_SIZE];int front;int rear;
} Queue;void initialize(Queue *q) {q->front = -1;q->rear = -1;}int is_empty(Queue *q) {return q->front == -1;}int is_full(Queue *q) {return q->rear == MAX_SIZE - 1;}void enqueue(Queue *q, int value) {if (is_full(q)) {printf("Queue is full\n");return;}if (is_empty(q)) {q->front = 0;}q->rear++;q->items[q->rear] = value;}int dequeue(Queue *q) {int item;if (is_empty(q)) {printf("Queue is empty\n");return -1;}item = q->items[q->front];q->front++;if (q->front > q->rear) {initialize(q);}return item;}int main() {Queue q;initialize(&q);enqueue(&q, 1);enqueue(&q, 2);printf("%d\n", dequeue(&q)); // 输出 1printf("%d\n", dequeue(&q)); // 输出 2return 0;}

2. 堆栈 (Stack)

堆栈是一种后进先出 (LIFO) 的数据结构。

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10typedef struct {int items[MAX_SIZE];int top;
} Stack;void initialize(Stack *s) {s->top = -1;
}int is_empty(Stack *s) {return s->top == -1;
}int is_full(Stack *s) {return s->top == MAX_SIZE - 1;
}void push(Stack *s, int value) {if (is_full(s)) {printf("Stack is full\n");return;}s->top++;s->items[s->top] = value;
}int pop(Stack *s) {int item;if (is_empty(s)) {printf("Stack is empty\n");return -1;}item = s->items[s->top];s->top--;return item;
}int main() {Stack s;initialize(&s);push(&s, 1);push(&s, 2);printf("%d\n", pop(&s)); // 输出 2printf("%d\n", pop(&s)); // 输出 1return 0;}

3. 单链表 (Singly Linked List)

单链表是一种线性数据结构,其中每个节点包含一个数据项和一个指向下一个节点的指针。

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node *next;
} Node;Node* create_node(int data) {Node *new_node = (Node*)malloc(sizeof(Node));if (new_node == NULL) {printf("Memory allocation failed\n");return NULL;}new_node->data = data;new_node->next = NULL;return new_node;}void insert_at_beginning(Node **head, int data) {Node *new_node = create_node(data);if (new_node == NULL) return;new_node->next = *head;*head = new_node;}void insert_at_end(Node **head, int data) {Node *new_node = create_node(data);if (new_node == NULL) return;if (*head == NULL) {*head = new_node;return;}Node *current = *head;while (current->next != NULL) {current = current->next;}current->next = new_node;}void delete_node(Node **head, int data) {if (*head == NULL) return;if ((*head)->data == data) {Node *temp = *head;*head = (*head)->next;free(temp);return;}Node *current = *head;while (current->next != NULL && current->next->data != data) {current = current->next;}if (current->next == NULL) return;Node *temp = current->next;current->next = current->next->next;free(temp);}void print_list(Node *head) {Node *current = head;while (current != NULL) {printf("%d -> ", current->data);current = current->next;}printf("NULL\n");
}int main() {Node *head = NULL;insert_at_end(&head, 1);insert_at_end(&head, 2);insert_at_beginning(&head, 0);print_list(head); // 输出 0 -> 1 -> 2 -> NULLdelete_node(&head, 1);print_list(head); // 输出 0 -> 2 -> NULLreturn 0;}

4. 双链表 (Doubly Linked List)

双链表是一种线性数据结构,其中每个节点包含一个数据项和两个指针,一个指向前一个节点,一个指向后一个节点。

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node *prev;struct Node *next;} Node;Node* create_node(int data) {Node *new_node = (Node*)malloc(sizeof(Node));if (new_node == NULL) {printf("Memory allocation failed\n");return NULL;}new_node->data = data;new_node->prev = NULL;new_node->next = NULL;return new_node;}void insert_at_beginning(Node **head, int data) {Node *new_node = create_node(data);if (new_node == NULL) return;new_node->next = *head;if (*head != NULL) {(*head)->prev = new_node;}*head = new_node;}void insert_at_end(Node **head, int data) {Node *new_node = create_node(data);if (new_node == NULL) return;if (*head == NULL) {*head = new_node;return;}Node *current = *head;while (current->next != NULL) {current = current->next;}current->next = new_node;new_node->prev = current;
}void delete_node(Node **head, int data) {if (*head == NULL) if ((*head)->data == data) {Node *temp = *head;*head = (*head)->next;if (*head != NULL) {(*head)->prev = NULL;}free(temp);return;}Node *current = *head;while (current != NULL && current->data != data) {current = current->next;}if (current == NULL) return;if (current->next != NULL) {current->next->prev = current->prev;}if (current->prev != NULL) {current->prev->next = current->next;}free(current);
}void print_list(Node *head) {Node *current = head;while (current != NULL) {printf("%d <-> ", current->data);current = current->next;}printf("NULL\n");}int main() {Node *head = NULL;insert_at_end(&head, 1);insert_at_end(&head, 2);insert_at_beginning(&head, 0);print_list(head); // 输出 0 <-> 1 <-> 2 <-> NULLdelete_node(&head, 1);print_list(head); // 输出 0 <-> 2 <-> NULLreturn 0;}

5. 二叉树 (Binary Tree)

二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node *left;struct Node *right;} Node;Node* create_node(int data) {Node *new_node = (Node*)malloc(sizeof(Node));if (new_node == NULL) {printf("Memory allocation failed\n");return NULL;}new_node->data = data;new_node->left = NULL;new_node->right = NULL;return new_node;}void insert(Node **root, int data) {if (*root == NULL) {*root = create_node(data);return;}if (data < (*root)->data) {insert(&((*root)->left), data);} else if (data > (*root)->data) {insert(&((*root)->right), data);}
}void inorder_traversal(Node *root) {if (root != NULL) {inorder_traversal(root->left);printf("%d ", root->data);inorder_traversal(root->right);}
}void preorder_traversal(Node *root) {if (root != NULL) {printf("%d ", root->data);preorder_traversal(root->left);preorder_traversal(root->right);}
}void postorder_traversal(Node *root) {if (root != NULL) {postorder_traversal(root->left);postorder_traversal(root->right);printf("%d ", root->data);}
}int main() {Node *root = NULL;insert(&root, 5);insert(&root, 3);insert(&root, 7);insert(&root, 1);insert(&root, 9);printf("Inorder traversal: ");inorder_traversal(root); // 输出 1 3 5 7 9printf("\n");printf("Preorder traversal: ");preorder_traversal(root); // 输出 5 3 1 7 9printf("\n");printf("Postorder traversal: ");postorder_traversal(root); // 输出 1 3 9 7 5printf("\n");return 0;}

上面这些代码展示了如何在C语言中实现常见的数据结构,并提供了基本的操作方法。

http://www.xdnf.cn/news/20238.html

相关文章:

  • 数据传输优化-异步不阻塞处理增强首屏体验
  • 自演化大语言模型的技术背景
  • 心理学家称AI大模型交流正在引发前所未见的精神障碍
  • 手把手教你用CUDA Graph:将你的LLM推理延迟降低一个数量级
  • 51单片机------中断系统
  • 51单片机基础day3
  • 开源混合专家大语言模型(DBRX)
  • Spring WebFlux 流式数据拉取与推送的实现
  • UIViewController生命周期
  • Word封面对齐技巧(自制)
  • UE4 UAT 的六大流程 build cook stage pacakge archive deploy 与UAT的参数
  • 硬件(二) 中断、定时器、PWM
  • 当电力设计遇上AI:良策金宝AI如何重构行业效率边界?
  • Linux2.6内核进程O(1)调度队列
  • 电机控制(三)-电机控制方法基础
  • Java集合---Collection接口和Map接口
  • C++:类和对象(中)
  • 在线测评系统---第n天
  • 执行select * from a where rownum<1;,数据库子进程崩溃,业务中断。
  • LabVIEW--二维数组、三维数组、四维数组
  • Pydantic模型验证测试:你的API数据真的安全吗?
  • Selenium 页面加载超时pageLoadTimeout与 iframe加载关系解析
  • 静态电流Iq 和 ICONT_MAX
  • GD32入门到实战32--产品配置参数存储方案 (NORFLASH)
  • rabbitmq 入门知识点
  • Go 自建库的使用教程与测试
  • 脑卒中目标检测含完整数据集
  • CSS 优先级详解:理解选择器权重和层叠规则
  • 鸿蒙NEXT动画开发指南:组件与页面典型动画场景解析
  • 【C++练习】06.输出100以内的所有素数