当前位置:   article > 正文

C语言链式存储结构和顺序存储结构

c语言链式存储

链式存储结构和顺序存储结构是两种常见的数据存储方式,用于在计算机程序中组织和管理数据。

1. 链式存储结构:
链式存储结构使用节点之间的指针关系来存储数据。每个节点包含数据和指向下一个节点的指针。链式存储结构具有以下特点:
- 内存中的节点可以分散存储,不要求连续的内存空间。
- 可以动态地添加、删除节点,不受存储空间大小限制。
- 插入和删除节点的时间复杂度为O(1)。
- 随机访问节点的时间复杂度为O(n),因为需要从头节点开始逐个遍历,直到找到目标节点。

链式存储结构常用于需要频繁插入和删除操作的场景,例如链表、树和图等数据结构。

链式存储结构的缺点是访问节点时需要遍历链表,效率相对较低。

2. 顺序存储结构
顺序存储结构使用连续的内存空间来存储数据元素,数据在内存中按照逻辑顺序依次存放。顺序存储结构具有以下特点:
- 数据元素在内存中占据连续的地址空间。
- 随机访问节点的时间复杂度为O(1),可以通过下标直接访问。
- 插入和删除节点的时间复杂度为O(n),因为需要移动其他元素的位置。

顺序存储结构常用于需要频繁访问和修改元素的场景,例如数组和矩阵等数据结构。

顺序存储结构的优点是访问元素的效率较高,但是插入和删除元素时需要移动其他元素,可能导致性能下降。

适用情况:

链式存储结构:

1. 需要频繁地进行插入和删除操作:链式存储结构可以通过改变指针的指向来高效地插入和删除元素,不需要移动其他元素,因此适合频繁执行插入和删除操作的场景。

2. 数据量动态变化:链式存储结构可以根据需要动态地分配和释放内存,适合处理数据量不确定或动态增长的情况。

3. 存储空间不连续:链式存储结构通过指针相连,可以克服顺序存储结构需要连续的存储空间的限制。

顺序存储结构:

1. 随机访问和索引操作频繁:顺序存储结构使用数组来存储数据,可以通过索引直接访问元素,因此适合需要频繁进行随机访问和索引操作的场景。

2. 存储空间要求相对较小:顺序存储结构在存储上更加紧凑,不需要额外的指针空间,适合存储空间要求相对较小的情况。

3. 数据量固定不变或者变化较小:顺序存储结构需要在存储时就确定存储空间大小,对于数据量固定不变或变化较小的情况,可以更好地利用存储空间。

参考代码:

链式存储:

  1. // 链式存储示例代码
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. // 定义链表节点结构体
  5. typedef struct Node {
  6. int data; // 节点数据
  7. struct Node* next; // 指向下一个节点的指针
  8. } Node;
  9. // 创建新节点
  10. Node* createNode(int data) {
  11. Node* newNode = (Node*)malloc(sizeof(Node)); // 分配内存
  12. if (newNode == NULL) {
  13. printf("内存分配失败\n");
  14. exit(1);
  15. }
  16. newNode->data = data; // 设置节点数据
  17. newNode->next = NULL; // 将节点的next指针初始化为NULL
  18. return newNode;
  19. }
  20. // 在链表末尾插入节点
  21. void appendNode(Node** head, int data) {
  22. Node* newNode = createNode(data); // 创建新节点
  23. if (*head == NULL) {
  24. *head = newNode; // 如果链表为空,则将头指针指向新节点
  25. } else {
  26. Node* current = *head;
  27. while (current->next != NULL) { // 找到链表的末尾节点
  28. current = current->next;
  29. }
  30. current->next = newNode; // 在末尾节点的next指针处插入新节点
  31. }
  32. }
  33. // 打印链表
  34. void printLinkedList(Node* head) {
  35. Node* current = head;
  36. while (current != NULL) { // 遍历链表
  37. printf("%d ", current->data); // 打印当前节点的数据
  38. current = current->next; // 移动到下一个节点
  39. }
  40. printf("\n");
  41. }
  42. int main() {
  43. Node* head = NULL; // 链表的头指针
  44. appendNode(&head, 1); // 在链表末尾插入节点
  45. appendNode(&head, 2);
  46. appendNode(&head, 3);
  47. printf("链式存储:\n");
  48. printLinkedList(head); // 打印链表
  49. return 0;
  50. }

顺序存储:

  1. // 顺序存储示例代码
  2. #include <stdio.h>
  3. #define MAX_SIZE 100 // 数组的最大大小
  4. // 初始化数组
  5. void initArray(int arr[], int size) {
  6. for (int i = 0; i < size; i++) {
  7. arr[i] = 0; // 将数组的元素初始化为0
  8. }
  9. }
  10. // 在数组末尾插入元素
  11. void appendArray(int arr[], int* size, int data) {
  12. if (*size < MAX_SIZE) { // 判断数组是否已满
  13. arr[*size] = data; // 将元素插入到数组末尾
  14. (*size)++; // 数组大小加1
  15. } else {
  16. printf("数组已满,无法插入\n");
  17. }
  18. }
  19. // 打印数组
  20. void printArray(int arr[], int size) {
  21. for (int i = 0; i < size; i++) {
  22. printf("%d ", arr[i]); // 打印数组元素
  23. }
  24. printf("\n");
  25. }
  26. int main() {
  27. int arr[MAX_SIZE]; // 数组
  28. int size = 0; // 数组的大小
  29. initArray(arr, MAX_SIZE); // 初始化数组
  30. appendArray(arr, &size, 1); // 在数组末尾插入元素
  31. appendArray(arr, &size, 2);
  32. appendArray(arr, &size, 3);
  33. printf("顺序存储:\n");
  34. printArray(arr, size); // 打印数组
  35. return 0;
  36. }

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

闽ICP备14008679号