当前位置:   article > 正文

白骑士的C语言教学高级篇 3.2 高级数据结构

白骑士的C语言教学高级篇 3.2 高级数据结构

系列目录

上一篇:白骑士的C语言教学高级篇 3.1 高级指针技术

        在计算机科学中,数据结构是组织和存储数据的方式,不同的数据结构适用于不同的问题和算法。本节将介绍链表、栈与队列以及树与图,这些高级数据结构在实际编程中非常常用,并且是许多复杂算法的基础。

链表

        链表是一种线性数据结构,其中的元素存储在节点中,每个节点包含数据和一个指向下一个节点的指针。链表的优点是插入和删除操作非常高效,但缺点是访问元素的时间复杂度较高,因为需要从头节点开始逐个遍历。

单向链表

        只有一个方向的指针,指向下一个节点,例如:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node {
  4.     int data;
  5.     struct Node *next;
  6. } Node;
  7. void append(Node **head, int data) {
  8.     Node *new_node = (Node *)malloc(sizeof(Node));
  9.     new_node->data = data;
  10.     new_node->next = NULL;
  11.     if (*head == NULL) {
  12.         *head = new_node;
  13.     }
  14. else {
  15.         Node *temp = *head;
  16.         while (temp->next != NULL) {
  17.             temp = temp->next;
  18.         }
  19.         temp->next = new_node;
  20.     }
  21. }
  22. void printList(Node *head) {
  23.     while (head != NULL) {
  24.         printf("%d -> ", head->data);
  25.         head = head->next;
  26.     }
  27.     printf("NULL\n");
  28. }
  29. int main() {
  30.     Node *head = NULL;
  31.     append(&head, 1);
  32.     append(&head, 2);
  33.     append(&head, 3);
  34.     printList(head);
  35.     return 0;
  36. }

双向链表

        具有两个方向的指针,分别指向前一个节点和后一个节点,例如:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node {
  4.     int data;
  5.     struct Node *prev;
  6.     struct Node *next;
  7. } Node;
  8. void append(Node **head, int data) {
  9.     Node *new_node = (Node *)malloc(sizeof(Node));
  10.     new_node->data = data;
  11.     new_node->next = NULL;
  12.     if (*head == NULL) {
  13.         new_node->prev = NULL;
  14.         *head = new_node;
  15.     }
  16. else {
  17.         Node *temp = *head;
  18.         while (temp->next != NULL) {
  19.             temp = temp->next;
  20.         }
  21.         temp->next = new_node;
  22.         new_node->prev = temp;
  23.     }
  24. }
  25. void printList(Node *head) {
  26.     while (head != NULL) {
  27.         printf("%d -> ", head->data);
  28.         head = head->next;
  29.     }
  30.     printf("NULL\n");
  31. }
  32. int main() {
  33.     Node *head = NULL;
  34.     append(&head, 1);
  35.     append(&head, 2);
  36.     append(&head, 3);
  37.     printList(head);
  38.     return 0;
  39. }

栈与队列

        栈(Stack)是一种后进先出(LIFO,Last In First Out)的数据结构,栈的操作主要有两个:‘push‘(入栈)和 ‘pop‘(出栈)。例如:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 100
  4. typedef struct Stack {
  5.     int data[MAX];
  6.     int top;
  7. } Stack;
  8. void push(Stack *stack, int value) {
  9.     if (stack->top < MAX - 1) {
  10.         stack->data[++stack->top] = value;
  11.     }
  12. else {
  13.         printf("Stack overflow\n");
  14.     }
  15. }
  16. int pop(Stack *stack) {
  17.     if (stack->top >= 0) {
  18.         return stack->data[stack->top--];
  19.     }
  20. else {
  21.         printf("Stack underflow\n");
  22.         return -1;
  23.     }
  24. }
  25. int main() {
  26.     Stack stack;
  27.     stack.top = -1;
  28.     push(&stack, 1);
  29.     push(&stack, 2);
  30.     push(&stack, 3);
  31.     printf("Popped: %d\n", pop(&stack));
  32.     printf("Popped: %d\n", pop(&stack));
  33.     return 0;
  34. }

队列

        队列(Queue)是一种先进先出(FIFO,First In First Out)的数据结构,队列的操作主要有两个:‘enqueue‘(入队)和 ‘dequeue‘(出队)。例如:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 100
  4. typedef struct Queue {
  5.     int data[MAX];
  6.     int front;
  7.     int rear;
  8. } Queue;
  9. void enqueue(Queue *queue, int value) {
  10.     if (queue->rear < MAX - 1) {
  11.         queue->data[++queue->rear] = value;
  12.         if (queue->front == -1) {
  13.             queue->front = 0;
  14.         }
  15.     }
  16. else {
  17.         printf("Queue overflow\n");
  18.     }
  19. }
  20. int dequeue(Queue *queue) {
  21.     if (queue->front > queue->rear || queue->front == -1) {
  22.         printf("Queue underflow\n");
  23.         return -1;
  24.     }
  25. else {
  26.         return queue->data[queue->front++];
  27.     }
  28. }
  29. int main() {
  30.     Queue queue;
  31.     queue.front = -1;
  32.     queue.rear = -1;
  33.     enqueue(&queue, 1);
  34.     enqueue(&queue, 2);
  35.     enqueue(&queue, 3);
  36.     printf("Dequeued: %d\n", dequeue(&queue));
  37.     printf("Dequeued: %d\n", dequeue(&queue));
  38.     return 0;
  39. }

树与图

        树(Tree)是一种层次数据结构,树中的每个节点包含一个数据元素和指向子节点的指针。树的典型应用包括二叉树、二叉搜索树(BST)等。

        二叉树是一种特殊的树结构,每个节点最多有两个子节点,例如:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node {
  4.     int data;
  5.     struct Node *left;
  6.     struct Node *right;
  7. } Node;
  8. Node* createNode(int data) {
  9.     Node *newNode = (Node *)malloc(sizeof(Node));
  10.     newNode->data = data;
  11.     newNode->left = NULL;
  12.     newNode->right = NULL;
  13.     return newNode;
  14. }
  15. void inorderTraversal(Node *root) {
  16.     if (root != NULL) {
  17.         inorderTraversal(root->left);
  18.         printf("%d -> ", root->data);
  19.         inorderTraversal(root->right);
  20.     }
  21. }
  22. int main() {
  23.     Node *root = createNode(1);
  24.     root->left = createNode(2);
  25.     root->right = createNode(3);
  26.     root->left->left = createNode(4);
  27.     root->left->right = createNode(5);
  28.     printf("Inorder Traversal: ");
  29.     inorderTraversal(root);
  30.     printf("NULL\n");
  31.     return 0;
  32. }

        图(Graph)是一种更复杂的数据结构,由节点(顶点)和边组成。图可以是有向图或无向图,应用广泛,如社交网络、交通网络等。

        邻接矩阵表示法是图的一种表示方法,例如:

  1. #include <stdio.h>
  2. #define MAX 5
  3. void addEdge(int graph[MAX][MAX], int u, int v) {
  4.     graph[u][v] = 1;
  5.     graph[v][u] = 1// 如果是无向图
  6. }
  7. void printGraph(int graph[MAX][MAX]) {
  8.     for (int i = 0; i < MAX; i++) {
  9.         for (int j = 0; j < MAX; j++) {
  10.             printf("%d ", graph[i][j]);
  11.         }
  12.         printf("\n");
  13.     }
  14. }
  15. int main() {
  16.     int graph[MAX][MAX] = {0};
  17.     addEdge(graph, 0, 1);
  18.     addEdge(graph, 0, 4);
  19.     addEdge(graph, 1, 2);
  20.     addEdge(graph, 1, 3);
  21.     addEdge(graph, 1, 4);
  22.     addEdge(graph, 2, 3);
  23.     addEdge(graph, 3, 4);
  24.     printGraph(graph);
  25.     return 0;
  26. }

总结

        高级数据结构在C语言编程中具有重要地位,掌握这些数据结构可以解决复杂的问题,提高程序的效率和灵活性。通过链表、栈与队列以及树与图的学习,将具备处理多种实际应用场景的能力。这些数据结构不仅在算法设计中广泛应用,而且是计算机科学领域的基础知识。

下一篇:白骑士的C语言教学高级篇 3.3 并发与多线程​​​​​​​

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/798618
推荐阅读
相关标签
  

闽ICP备14008679号