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

数据结构学习(day01)

1.数据结构基本概念

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。它是计算机存储、组织数据的方式,直接影响程序的效率和性能。

2.数据结构分类

1.逻辑结构

        集合结构:所有数据都在一个集合中,元素间关系平等。

        线性结构:数据之间是一对一的关系,如数组、链表。

        树状结构:数据之间是一对多的关系,如二叉树、B树。

2.物理结构(存储结构)

        顺序存储:数据存储在连续的存储单元中,如数组。

        链式存储:数据存储单元可以是任意的,通过指针连接,如链表。

链式存储概述

线性表的链式存储(单向链表)解决了顺序存储的以下问题:

  • 插入和删除效率低(顺序表需要移动大量元素)
  • 动态存储问题(顺序表需要预先分配固定空间)

特点:

存储单元可以是连续的,也可以是不连续的。

每个节点(Node)包含:

        数据域:存储数据元素

        指针域:存储下一个节点的地址通过指针链接各个节点,形成链式结构。

单向链表的基本操作(C语言实现)

头文件定义
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef int DATATYPE;  // 数据类型可自定义typedef struct LinkNode {DATATYPE data;          // 数据域struct LinkNode *next;  // 指针域
} LinkNode;typedef struct LinkList {LinkNode *head;  // 头指针int clen;        // 当前链表长度
} LinkList;
创建链表
LinkList *CreateLinkList() {LinkList *ll = (LinkList *)malloc(sizeof(LinkList));if (ll == NULL) {fprintf(stderr, "CreateLinkList malloc failed\n");return NULL;}ll->head = NULL;ll->clen = 0;return ll;
}
头插法
int InsertLinkList(LinkList *ll, DATATYPE *data) {if (ll == NULL || data == NULL) {fprintf(stderr, "Invalid arguments\n");return 1;}LinkNode *newnode = (LinkNode *)malloc(sizeof(LinkNode));if (newnode == NULL) {fprintf(stderr, "InsertLinkList malloc failed\n");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = ll->head;  // 新节点指向原头节点ll->head = newnode;        // 更新头指针ll->clen++;return 0;
}
判断链表是否为空
int IsEmptyLinkList(LinkList *ll) {if (ll == NULL) {fprintf(stderr, "Invalid argument\n");return -1;}return (ll->head == NULL) ? 1 : 0;
}
显示链表
void ShowLinkList(LinkList *ll) {if (ll == NULL || ll->head == NULL) {printf("LinkList is empty\n");return;}LinkNode *temp = ll->head;while (temp != NULL) {printf("%d -> ", temp->data);temp = temp->next;}printf("NULL\n");
}
查找节点
LinkNode *SearchLinkList(LinkList *ll, DATATYPE key) {if (ll == NULL || ll->head == NULL) {return NULL;}LinkNode *temp = ll->head;while (temp != NULL) {if (temp->data == key) {return temp;}temp = temp->next;}return NULL;
}
删除节点
int DeleteLinkList(LinkList *ll, DATATYPE key) {if (ll == NULL || ll->head == NULL) {fprintf(stderr, "LinkList is empty\n");return 1;}LinkNode *prev = NULL;LinkNode *curr = ll->head;while (curr != NULL) {if (curr->data == key) {if (prev == NULL) {  // 删除头节点ll->head = curr->next;} else {             // 删除中间或尾节点prev->next = curr->next;}free(curr);ll->clen--;return 0;}prev = curr;curr = curr->next;}fprintf(stderr, "Key not found\n");return 1;
}

总结

操作时间复杂度说明
头插法O(1)直接在头部插入
尾插法O(n)需要遍历到链表末尾
查找O(n)最坏情况遍历整个链表
删除O(n)需要找到目标节点

优点:

        动态分配内存,无需预先指定大小        

        插入和删除高效(O(1) 头插,O(n) 随机位置)

缺点:

        访问元素需要遍历(O(n))

         额外存储指针,占用更多内存

http://www.dtcms.com/a/313444.html

相关文章:

  • 第八章:进入Redis的SET的核心
  • Android系统模块编译调试与Ninja使用指南
  • 【数据分享】各省粮食外贸依存度、粮食波动率等粮食相关数据合集(2011-2022)(获取方式看文末)
  • 【MATLAB】(六)多项式的创建与四则运算
  • python的高校奖助学金系统
  • 23 Active Directory攻击与防护策略解析
  • 编译旧版本的electron内核
  • SpringBoot之整合MyBatisPlus
  • Nvidia Orin DK 刷机CUDA TensorRT+硬盘扩容+ROS+Realsense+OpenCV+Ollama+Yolo11 一站式解决方案
  • 从“配置地狱”到“云端乐园”——Nacos 如何成为分布式微服务配置中心的“定海神针”
  • 数组和指针的关系
  • 操作系统——读者写者问题
  • KNX协议介绍
  • Nvidia Orin + RealSense D435i 与3D地图实现导航
  • Ubuntu系统VScode实现opencv(c++)视频的处理与保存
  • [硬件电路-129]:模拟电路 - 继电器的工作原理、关键指标、常用芯片与管脚定义
  • SpringAI的使用
  • Socket编程——TCP协议
  • 从一到无穷大 #51:突破阿姆达尔定律:COZ因果剖析与串行优化八法
  • Java学习第一百零一部分——网关(Gateway)
  • java测试题(ssm框架)
  • 02.Redis 安装
  • MPLS 静态LSP
  • TV电视版软件集合分享
  • 深入理解Java并发编程:原理、实战与最佳实践
  • Redis 7 中的 Set 和 Zset 使用
  • 基于transformer的目标检测——匈牙利匹配算法
  • 深入解析HashMap:原理与性能优化
  • Vim编辑器详解:从入门到高效使用
  • 从零开始的CAD|CAE开发: LBM源码实现分享