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

常规链表建立

常规链表建立

列举常见的顺序表功能实现函数,进行编程练习

  1. 常规顺序表(sequeue)建立

    • 定义一个顺序表的大小,结构体中采用数组而不是另一个堆内存空间表示存储的数据信息。

      typedef int data_t; // 定义顺序表中数据元素的数据类型
      #define N 20         // 定义顺序表的容量
      typedef struct
      {data_t data[N]; // 用数组作为顺序表存储空间int last; // last表示有效元素的下标(类比于数组下标)
      }sqlist, *sqlink;
      
    • 编程实现各种功能函数:

      • 创建顺序表

        sqlink list_create()
        {sqlink L;L = (sqlink)malloc(sizeof(sqlist));//实现内容的空间申请,结合后续初始化;此处可以采用calloc函数进行优化处理。if (L == NULL)//判断内存是否申请成功{printf("list malloc failed!\n");return L;}memset(L, 0, sizeof(sqlist));L->last = -1;//当顺序表内容没任何值时,应该从-1算起;如果从0开始算,则表示一开始就有一个值。return L;
        }
        
      • 清空顺序表

        判断函数是否成功时,返回值可以用整型int,或者布尔型bool表达。此处空表直接返回,不予清空。0代表成功,-1代表失败

        int list_clear(sqlink L)
        {if (L == NULL)return -1;memset(L, 0, sizeof(sqlist));L->last = -1;return 0;
        }
        
      • 释放顺序表申请的堆空间

        int list_free(sqlink L)
        {if (NULL == L)return -1;free(L);L = NULL;return 0;
        }
        
      • 删除顺序表中指定位置的数据

        int list_delete(sqlink L, int pos)
        {if (-1 == L->last){printf("list is empty");return -1;}if (pos < 0 || pos >= L->last)// 检查该指定位置是否合法{printf("The list is invalid\n");return -1;}int i = 0;for (i = pos; i <= L->last; i++)// 删除指定成员,即将该处后续元素依次往前覆盖{L->data[i] = L->data[i + 1];}L->last--;//最后更新last的值return 0;
        }
        
      • 检查顺序表是否为空表

        int list_empty(sqlink L)
        {if (L->last == -1)//当为空表时,下标last为-1return -1;elsereturn 0;
        }
        
      • 测量顺序表的长度

        int list_length(sqlink L)
        {if (L->last == -1)//当为空表时,下标last为-1,否则就有长度return -1;elsereturn (L->last + 1);
        }
        
      • 定位指定值在该顺序表的位置

        int list_locate(sqlink L, data_t value)
        {int i;for (i = 0; i < L->last; i++){if (L->data[i] == value)//利用便利,检测指定值在该顺序表的位置并返回return i;}return -1;
        }
        
      • 指定位置插入某个指定的值

        int list_insert(sqlink L, data_t value, int pos)
        {int i;if (L->last == N - 1)//判断空表{printf("The list is full\n");return -1;}if (pos < 0 || pos > L->last + 1)// 检查该指定位置是否合法{printf("Pos is invalid\n");return -1;}for (i = L->last; i >= pos; i--)//将指定位置处,后续的值都往后腾出一个位置,用来放指定的值。{L->data[i + 1] = L->data[i];}L->data[pos] = value;L->last++;return 0;
        }
        
      • 顺序表内容展示

        int list_show(sqlink L)
        {int i;if (L == NULL)return -1;if (L->last == -1)//空表就无需展示printf("list is empty.\n");for (i = 0; i <= L->last; i++)//利用for循环打印每个元素printf("%d ", L->data[i]);puts("");//遍历完成,输出回车以和别的函数区分return 0;
        }
        
      • 合并两个元素类型相同顺序表

        int list_merge(sqlink L1, sqlink L2)//合并L1 和L2 顺序表,并消除相同元素
        {int i = 0;int ret;while (i <= L2->last){ret = list_locate(L1, L2->data[i]);// ret 为-1时,即L2->data[i]在L1无重复元素,直接从尾部插入。if (ret == -1)list_insert(L1, L2->data[i], L1->last + 1);i++;}return 0;
        }
        
      • 删除单个顺序表中相同的元素

        int list_purge(sqlink L)
        {int i = 1;int j;if (L->last == 0)//判断顺序表是否仅一个元素return 0;while (i <= L->last){j = i - 1;while (j >= 0){if (L->data[i] == L->data[j])//存在相同元素时,进行删除操作{list_delete(L, i);break;}elsej--;if (j < 0)//内部遍历完成后,进行外部遍历,保证每个元素都进行对比i++;}}
        }
        
  2. 常规顺序表功能调试

    为了方便进行测试各个功能函数,本文将为每个测试都单独写成了一个函数,仅需进行单独调用即可进行测试,思路较为清晰。

    • 函数主体如下,每次进行测试时,取消对应函数注释即可,并且尤其注意,如果是模块化编程,需要在主函数前进行函数声明。

      int main(int argc, const char *argv[])
      {//void test_delete();//void test_merge();test_purge();return 0;
      }
      
    • 各测试函数如下,符合模块化编程思想:

      • 插入功能,及单顺序表合并测试

      • void test_purge()
        {sqlink L;L = list_create();list_insert(L, 10, 0);list_insert(L, 20, 0);list_insert(L, 30, 0);list_insert(L, 20, 0);list_insert(L, 30, 0);list_show(L);list_purge(L);list_show(L);
        }
        
      • 删除测试

      • void test_delete()
        {sqlink L;L = list_create();list_insert(L, 10, 0);list_insert(L, 20, 0);list_insert(L, 30, 0);list_insert(L, 40, 0);list_insert(L, 50, 0);list_show(L);list_delete(L, 15);list_show(L);
        }
        
      • 双顺序表合并测试

      • void test_merge()
        {sqlink L1, L2;L1 = list_create();L2 = list_create();list_insert(L1, 10, 0);list_insert(L1, 20, 0);list_insert(L1, 30, 0);list_insert(L1, 40, 0);list_insert(L1, 50, 0);list_insert(L2, 30, 0);list_insert(L2, 40, 0);list_insert(L2, 60, 0);list_insert(L2, 70, 0);list_insert(L2, 80, 0);list_show(L1);list_show(L2);list_merge(L1, L2);list_show(L1);
        }
        
http://www.jsqmd.com/news/44839/

相关文章:

  • HDLBits网站学习——Procedures
  • win11为什么我的不显示虚拟机平台选项
  • 2025 年最新http 代理服务商权威推荐排行榜:百万级 IP 资源 + 国际认证高可用率,爬虫 / 动态 / 高匿代理优选指南不限量 http 代理/独享 http 代理平台推荐
  • 安装部署opengauss
  • 不只做语音,ElevenLabs 推出图像和视频生成平台;博通推出语音 AI 芯片,实现端侧 TTS 和实时翻译丨日报
  • 海外直播源码选型指南:技术架构与合规性细节解析及成品多语言直播APP源码交付
  • 视频汇聚平台EasyCVR如何通过可视化管理与远程运维赋能安防“一张网”
  • 单向循环链表接口设计
  • 2025 最新雕刻机源头厂家权威推荐榜:自主研发专利加持 + 国际测评认证,高精度设备优选清单数控雕刻机/激光雕刻机/小型雕刻机/金属雕刻机公司推荐
  • linux firewall
  • 2025 年 11 月高温老化房厂家推荐排行榜,老化室、高温老化室、高温房、熟化房、固化房、恒温恒湿室、恒温房、恒温恒湿房公司推荐
  • 2025 年 11 月耐磨钢板厂家推荐排行榜,高耐磨钢板,高锰耐磨钢板,焊达500耐磨钢板,进口复合耐磨钢板,双金属复合耐磨钢板公司推荐
  • 2025 年 11 月耐磨板厂家推荐排行榜,国产耐磨板,悍达耐磨板,堆焊耐磨板,进口耐磨板,MN13耐磨板,NM360-NM600高强度耐磨板,高铬合金耐磨板公司推荐!
  • 视频融合平台EasyCVR助力守护渔业牧区安全与增效
  • 2025 最新推荐!精雕机厂家口碑排行榜,国际协会测评认证 + 多行业适配实力权威发布高校合作精雕机/东莞精雕机/广东精雕机公司推荐
  • 2025 最新供水设备源头厂家推荐排行榜:无负压 / 恒压 / 变频供水设备实力品牌精选
  • 2025 最新限制器厂家权威推荐榜:国际测评认证 + 年产超 20 万套实力品牌,生产与服务全方位评估展现卓越制造能力限制器/扭力限制器/扭矩限制器公司推荐
  • 2025 年安全联轴器厂家最新推荐榜单:权威测评优质厂家 ,铸就传动安全与品质保障标杆
  • 2025 年智慧停车系统、高校智慧停车系统十大品牌权威推荐!破解停车难题,这些优质品牌值得选择
  • 实用指南:智慧家政系统:未来家庭管理的核心技术解析
  • 【广东工业大学东莞理工学院联合主办,IEEE出版】第六届机械工程、智能制造与自动化技术国际学术会议(MEMAT 2025)
  • 给Snipe-IT添加扫码盘点
  • 2025 最新推荐沈阳阳光房厂家实力榜单:国际协会测评认证 + 专利技术加持,20000 平厂房保障品质与交付沈阳阳光房公司推荐
  • 2025 最新电磁灶厂家权威推荐榜:聚焦商用大功率 / 智能款,国际测评认证口碑实力双优品牌合集商用多头/商用智能/SUKIO/3500 瓦大功率/SUKI0/硕高电磁灶公司推荐
  • 移动端反射探针格式用什么比较合理
  • linux find 删除
  • 完整教程:Navicat - 连接 mysql 、 sqlserver 数据库 步骤与问题解决
  • 2025年平衡重制造企业权威推荐榜单:平衡块订做/后平衡铁工厂/尾部配重铁源头厂家精选
  • 03.入门篇-集成开发环境
  • 2025 最新祛斑加盟招商品牌权威推荐榜:国际协会测评认证 + 全链条品质标杆,创业加盟优选指南