ToB企服应用市场:ToB评测及商务社交产业平台

标题: 顺序表、链表、栈和队列总结 [打印本页]

作者: 拉不拉稀肚拉稀    时间: 2024-6-8 21:39
标题: 顺序表、链表、栈和队列总结
目次
顺序表
链表

队列
总结
补充
顺序表
实现
链表
实现

实现
队列
实现

    顺序表、链表、栈和队列都是线性数据结构,但它们在管理和访问数据方面有不同的特点和用途。以下是它们之间的主要区别:
顺序表


链表





队列


总结


选择哪种数据结构取决于具体应用场景和对数据利用的频繁程度。
补充

队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。
栈的实现

栈的实现一样平常可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小。
顺序表
是一种线性表,在C语言中通常通过数组来实现。它具有以下特点:
在C语言中实现顺序表,必要定义以下几个根本利用:

下面是一个简单的顺序表在C语言中的
实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct {
  4.     int *data;
  5.     int size;
  6. } SequenceList;
  7. SequenceList *init_sequence_list(int size) {
  8.     SequenceList *list = (SequenceList *)malloc(sizeof(SequenceList));
  9.     list->data = (int *)malloc(size * sizeof(int));
  10.     list->size = size;
  11.     return list;
  12. }
  13. void free_sequence_list(SequenceList *list) {
  14.     free(list->data);
  15.     free(list);
  16. }
  17. void sequence_list_insert(SequenceList *list, int index, int value) {
  18.     if (index < 0 || index > list->size) {
  19.         printf("Index out of bounds\n");
  20.         return;
  21.     }
  22.     for (int i = list->size; i > index; i--) {
  23.         list->data[i] = list->data[i - 1];
  24.     }
  25.     list->data[index] = value;
  26.     list->size++;
  27. }
  28. int sequence_list_get(SequenceList *list, int index) {
  29.     if (index < 0 || index >= list->size) {
  30.         printf("Index out of bounds\n");
  31.         return -1;
  32.     }
  33.     return list->data[index];
  34. }
复制代码
链表

链表是由一系列节点构成,每个节点包罗数据域和指向下一个节点的指针。
实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node {
  4.     int value;
  5.     struct Node *next;
  6. } LinkList;
  7. LinkList *init_link_list() {
  8.     LinkList *head = (LinkList *)malloc(sizeof(LinkList));
  9.     head->next = NULL;
  10.     return head;
  11. }
  12. void free_link_list(LinkList *head) {
  13.     LinkList *temp;
  14.     while (head != NULL) {
  15.         temp = head;
  16.         head = head->next;
  17.         free(temp);
  18.     }
  19. }
  20. void link_list_insert(LinkList *head, int value) {
  21.     LinkList *new_node = (LinkList *)malloc(sizeof(LinkList));
  22.     new_node->value = value;
  23.     new_node->next = head->next;
  24.     head->next = new_node;
  25. }
复制代码


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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct {
  4.     int *data;
  5.     int top;
  6.     int size;
  7. } Stack;
  8. Stack *init_stack(int size) {
  9.     Stack *stk = (Stack *)malloc(sizeof(Stack));
  10.     stk->data = (int *)malloc(size * sizeof(int));
  11.     stk->top = -1;
  12.     stk->size = size;
  13.     return stk;
  14. }
  15. void free_stack(Stack *stk) {
  16.     free(stk->data);
  17.     free(stk);
  18. }
  19. void stack_push(Stack *stk, int value) {
  20.     if (stk->top >= stk->size - 1) {
  21.         printf("Stack overflow\n");
  22.         return;
  23.     }
  24.     stk->data[++stk->top] = value;
  25. }
  26. int stack_pop(Stack *stk) {
  27.     if (stk->top < 0) {
  28.         printf("Stack underflow\n");
  29.         return -1;
  30.     }
  31.     return stk->data[stk->top--];
  32. }
复制代码
队列

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define QUEUE_SIZE 100
  4. typedef struct {
  5.     int data[QUEUE_SIZE];
  6.     int front;
  7.     int rear;
  8.     int count;
  9. } Queue;
  10. Queue *init_queue() {
  11.     Queue *q = (Queue *)malloc(sizeof(Queue));
  12.     if (q) {
  13.         q->front = q->rear = 0;
  14.         q->count = 0;
  15.     }
  16.     return q;
  17. }
  18. void free_queue(Queue *q) {
  19.     free(q);
  20. }
  21. int is_queue_empty(Queue *q) {
  22.     return q->count == 0;
  23. }
  24. int is_queue_full(Queue *q) {
  25.     return q->count == QUEUE_SIZE;
  26. }
  27. void enqueue(Queue *q, int value) {
  28.     if (is_queue_full(q)) {
  29.         printf("Queue is full. Cannot enqueue.\n");
  30.         return;
  31.     }
  32.     q->data[q->rear] = value;
  33.     q->rear = (q->rear + 1) % QUEUE_SIZE;
  34.     q->count++;
  35. }
  36. int dequeue(Queue *q) {
  37.     if (is_queue_empty(q)) {
  38.         printf("Queue is empty. Cannot dequeue.\n");
  39.         return -1;
  40.     }
  41.     int value = q->data[q->front];
  42.     q->front = (q->front + 1) % QUEUE_SIZE;
  43.     q->count--;
  44.     return value;
  45. }
  46. int main() {
  47.     Queue *q = init_queue();
  48.    
  49.     enqueue(q, 1);
  50.     enqueue(q, 2);
  51.     enqueue(q, 3);
  52.    
  53.     printf("Dequeue: %d\n", dequeue(q));
  54.     printf("Dequeue: %d\n", dequeue(q));
  55.    
  56.     if (is_queue_empty(q)) {
  57.         printf("Queue is empty.\n");
  58.     } else {
  59.         printf("Queue is not empty.\n");
  60.     }
  61.    
  62.     free_queue(q);
  63.     return 0;
  64. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4