顺序表、链表、栈和队列总结

打印 上一主题 下一主题

主题 511|帖子 511|积分 1535

目次
顺序表
链表

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

实现
队列
实现

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



  • 存储方式:在连续的内存空间中存储元素。
  • 访问方式:通过索引直接访问,时间复杂度为O(1)。
  • 插入/删除:在表尾插入或删除元素,时间复杂度为O(n),因为可能必要移动元素。
  • 动态性:通常必要预先分配固定巨细的存储空间,但如果必要,可以动态扩容。
  • 内存占用:可能会有未使用的内存空间,因为通常会分配比当前所需更大的空间。
链表



  • 存储方式:由一系列节点构成,每个节点包罗数据域和指向下一个节点的指针。
  • 访问方式:必要重新节点开始遍历,时间复杂度为O(n)。
  • 插入/删除:在恣意位置插入或删除元素,时间复杂度为O(1),因为只需改变指针。
  • 动态性:可以动态地分配节点,因此不必要预先分配固定巨细的存储空间。
  • 内存占用:每个节点只存储数据和指向下一个节点的指针,因此可能更节流内存。




  • 特点:后进先出(LIFO)的数据结构。
  • 存储方式:可以是顺序表或链表的情势。
  • 访问方式:只能访问栈顶元素,时间复杂度为O(1)。
  • 插入/删除:只能在栈顶插入或删除元素,时间复杂度为O(1)。
  • 动态性:可以是固定巨细的,也可以是动态扩容的。
  • 内存占用:与顺序表雷同,可能会有未使用的内存空间。
队列



  • 特点:先进先出(FIFO)的数据结构。
  • 存储方式:可以是顺序表或链表的情势。
  • 访问方式:只能访问队头或队尾元素,时间复杂度为O(1)。
  • 插入:在队尾插入元素,时间复杂度为O(1)。
  • 删除:从队头删除元素,时间复杂度为O(1)。
  • 动态性:可以是固定巨细的,也可以是动态扩容的。
  • 内存占用:与顺序表雷同,可能会有未使用的内存空间。
总结



  • 顺序表链表的主要区别在于存储方式和内存利用率。顺序表得当随机访问,而链表得当动态插入和删除。
  • 队列都是线性数据结构,但它们的利用方式不同。栈是后进先出的,而队列是先进先出的。
  • 队列通常都可以用顺序表或链表来实现,根据必要选择。
选择哪种数据结构取决于具体应用场景和对数据利用的频繁程度。
补充

队列的实现

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

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

  • 连续的内存空间:顺序表中的元素存储在一块连续的内存空间中。
  • 随机访问:可以通过下标直接访问任何一个位置的元素,访问时间为常数时间O(1)。
  • 固定容量:通常情况下,顺序表的容量是固定的,当必要存储的元素个数凌驾当前容量时,必要进行扩容利用。
在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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表