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

数据结构作业

数据结构概念核心要点

一、数据结构基础
  1. 数据、数据元素、数据项

    • 数据:操作对象(文本、音视频等)。
    • 数据元素:数据的基本单位(如一条记录)。
    • 数据项:数据元素的不可再分的最小单位(如记录中的字段)。
  2. 逻辑结构

    • 线性结构:元素一对一关系(如顺序表、链表)。
    • 非线性结构:树(一对多)、图(多对多)。
    • 特点:逻辑关系独立于存储方式。
  3. 物理结构

    • 顺序存储:元素物理地址连续(如数组)。
    • 链式存储:通过指针链接,地址不连续(如链表)。
    • 哈希存储:基于哈希表实现快速访问。

顺序表核心要点

一、顺序表定义
  1. 特点

    • 逻辑结构为线性结构,物理结构为顺序存储。
    • 类似数组,但需额外记录实际元素个数(len字段)。
  2. 结构体定义

    c

     
    typedef struct {
    int data[MAX]; // 存储数据的数组
    int len; // 当前元素个数
    } seq_list, *seq_p;

二、基本操作及实现逻辑
  1. 创建顺序表

    • 动态申请内存(堆区),返回结构体指针。
    • 代码示例:

      c

       
      seq_p create_seqlist() {
      seq_p P = (seq_p)malloc(sizeof(seq_list));
      if (P == NULL) return NULL;
      P->len = 0; // 初始长度为0
      return P;
      }
  2. 插入操作

    • 尾插:直接添加元素到末尾,时间复杂度 O(1)

      c

       
      void insert_tail(seq_p P, int new_data) {
      if (P->len >= MAX) return; // 判满
      P->data[P->len++] = new_data;
      }
    • 头插:所有元素后移一位,时间复杂度 O(n)

      c

       
      void insert_head(seq_p P, int new_data) {
      for (int i = P->len; i > 0; i--)
      P->data[i] = P->data[i-1];
      P->data[0] = new_data;
      P->len++;
      }
    • 按位置插入:需移动后续元素,时间复杂度 O(n)
  3. 删除操作

    • 头删:所有元素前移一位,时间复杂度 O(n)

      c

       
      void del_head(seq_p P) {
      for (int i = 0; i < P->len-1; i++)
      P->data[i] = P->data[i+1];
      P->len--;
      }
    • 按位置删除:类似头删,需移动元素。
  4. 判满与判空

    • 判满len == MAX
    • 判空len == 0
  5. 按值查找

    • 遍历顺序表,返回第一个匹配元素的下标,时间复杂度 O(n)

三、关键注意事项
  1. 边界条件处理

    • 插入/删除前需检查表是否已满或为空。
    • 检查参数合法性(如指针是否为NULL)。
  2. 时间复杂度分析

    • 插入/删除头部:O(n)(需移动元素)。
    • 随机访问:O(1)(直接通过下标)。

四、作业与扩展
  1. 实现按位置插入/删除:需校验位置合法性(0 ≤ pos ≤ len)。
    void del_pos(seq_p P,int pos)                                     
    {                                                                 if(P==NULL||pos<0||pos>P->len||empty_seq(P))                  {                                                             return;                                                   }                                                             for(int i=pos;i<P->len-1;i++)                                 {                                                             P->data[i]=P->data[i+1];                                  }                                                             P->len--;                                                     
    }                                                                 void find_pos(seq_p P,int pos)                                    
    {                                                                 if (P == NULL || pos< 0 || pos >= P->len || empty_seq(P))     {                                                             printf("位置无效或顺序表为空\n");                         return;                                                   }                                                             printf("位置 %d 的值是 %d\n", pos, P->data[pos]);             
    }                                                                 

  2. 按值查找优化:可返回所有匹配位置或使用二分查找(若有序)。
    void find_value(seq_p P, int value)
    {                             if (P == NULL || empty_seq(P)){                                                       printf("未找到或顺序表为空\n");return;                                             }                                                       for (int i = 0; i<P->len; i++)                          {                                                       if (P->data[i] == value)                            {                                                   printf("值 %d 在位置 %d 处找到\n", value, i);   return;                                     }                                                   }                                                       printf("未找到值 %d\n", value);                    
    } 
    

  3. 刷题建议:牛客网《剑指Offer》或LeetCode“数组”分类题目。

总结

顺序表是线性表的顺序存储实现,核心操作需注意元素移动和边界条件,适合读多写少的场景,但插入/删除效率较低。

相关文章:

  • vue2中基于el-select封装一个懒加载下拉框
  • 从源码到实战:深度解析`rsync`增量同步机制与高级应用
  • 【HDFS入门】HDFS核心组件DataNode详解:角色职责、存储机制与健康管理
  • MyBatis-Plus 详解教程
  • 【专题刷题】双指针(一)
  • 静态站点生成
  • 解决USG5150防火墙web无法连接问题
  • 【AI论文】PixelFlow:基于流的像素空间生成模型
  • 【android bluetooth 协议分析 21】【ble 介绍 1】【什么是RPA】
  • DDS信号发生器设计
  • 自编码网络深度解析:原理、数学推导与实现细节
  • 标易行项目redis内存中放哪些数据
  • linux多线(进)程编程——(7)消息队列
  • 熟悉Linux下的编程
  • MySQL分组查询和子查询
  • secsgem v0.3.0版本使用说明文档
  • 探索 C 与 Java/Kotlin 的语言差异:从指针到高阶函数
  • 深入定制 QSlider——实现精准点击跳转与拖拽区分
  • 用Python手搓一个简单的饭店管理系统(上篇)
  • 依赖注入(DI)与自动装配的深度分析:优势、局限与实践考量
  • 泽连斯基:俄军违反停火承诺,20日10时起前线俄炮击增加
  • 错失两局领先浪费赛点,王楚钦不敌雨果无缘世界杯男单决赛
  • 网络社群的早期历史及其启示
  • 长沙岳麓警方通报“女子疑被性侵”:正在进一步侦办
  • “雪豹瘫痪”“漂流小孩哥大闹幼儿园”都是谣言!10起典型案例公布
  • 江西南昌:千年银杏树倒伏,全力抢救进行时​