线性表的顺序结构,C语言实现

2023-11-06

线性表的顺序结构,C语言实现

#include <stdio.h>
#include <stdlib.h>

#define LISTSIZE_INIT 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 50  //线性表存储空间的分配增量

typedef int ElemType;     //数据元素的类型,int型

/*定义线性表*/
typedef struct {
    ElemType *elem;  //存储空间的基地址
    int length;      //当前线性表的长度
    int size;        //当前分配的存储容量
}SqList;


/*初始化*/
int InitList(SqList *list) {
    // 开辟第一个存储空间
    ElemType *elem = (ElemType *)malloc(LISTSIZE_INIT * sizeof(ElemType));
    // 判断空间是否分配成功
    if (!list->elem) {
        return -1;
    }
    // 将第一个存储空间的地址(基地址)赋值给elem
    list->elem = elem;
    // 当前长度
    list->length = 0;
    // 当前分配量
    list->size = LISTSIZE_INIT;
    return 0;
}

/*插入元素,按照下标插入,下标从0~n*/
int ListInsert(SqList *list ,int index, ElemType elem) {
    
    // 判断是否越界
    if (index < 0 || index > list->length) {
        return -1;
    }
    // 判断存储空间是否够用
    if (list->length >= list->size) {
        ElemType *newElem = (ElemType *)realloc(list->elem, (list->size + LISTINCREMENT) * sizeof(ElemType));
        if (!newElem) return -1;    //存储空间分配失败
        list->elem = newElem;       //新基址
        list->size += LISTINCREMENT;//增加存储容量
    }
    // 插入操作
    ElemType *q,*p = NULL; //定义2个指针变量
    q = &(list->elem[index]); //取出当前线性表下标为index的数据
    // 从线性表最后一个元素开始,指针后移
    for (p = (&(list->elem[list->length-1])); p >= q; --p) {
        *(p+1) = *p;
    }
    // 将插入的元素放到原来q的位置上,即插入一个新的指针。
    *q = elem;
    // 线性表长+1。
    ++list->length;
    return 0;
}


/*删除元素,按照下标删除,下标从0~n*/
int ListDelete(SqList *list,int index) {
    if (index < 0 || index > list->length-1) {
        return -1;
    }
    // 删除操作
    ElemType *q, *p = NULL;
    q = &(list->elem[index]); // 取出当前要删除的元素
    p = &(list->elem[list->length-1]); // 线性表最后一个元素
    
    for (; p >= q; ++q) {
        *q = *(q+1);
    }

    --list->length; //表长-1
    
    return 0;
}

int main(int argc, const char * argv[]) {
    // insert code here...

    // 初始化一个线性表
    SqList list;
    InitList(&list);
    
    printf("插入操作 \n");
    // 插入元素
    for (int i = 0; i < 10; i++)
    {
        if (ListInsert(&list, i, i) == 0) {
            printf("%d \n", list.elem[i]);
        }
    }
    
    
    printf("删除操作 \n");
    // 删除元素
    if (ListDelete(&list, 8) == 0) {
        // 遍历线性表
        for (int i = 0; i < list.length-1; i++) {
            printf("%d \n", list.elem[i]);
        }
    } else {
        printf("delete failed \n");
    }
    
    printf("表长:%d \n",list.length);

    return 0;
}

有一个问题:关于删除操作,会不会造成内存泄露的问题?或者其他内存问题呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性表的顺序结构,C语言实现 的相关文章

  • smali文件对比java文件

    smali文件对比java文件 class 类名 super 父类 source 源文件名 implements 继承的接口 field 类成员变量 method 类方法 parameter 函数参数 p1 p2 locals x 局部变量

随机推荐

  • 活动目录服务详细操作

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有收获 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 目录 第一章 Active Directory与
  • 技术赋能水务数字化转型,上海市水旱灾害防御技术中心领导一行调研上海控安

    NEWS 3月1日下午 上海市水旱灾害防御技术中心主任张鹏一行莅临上海控安 对双方联合实验室建设及公司智慧水务板块业务进行调研指导 并就助力上海城市水务高质量发展及数字化转型相关工作展开交流讨论 上海控安总经理蒲戈光 首席信息官杨昆等平台公
  • 【旅行商问题】蚁群算法解决旅行商问题【Matlab】

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 旅行商问题 1 问题描述 2 数学模型 二 蚁群算法 1 引言 2 蚁群算法求解TSP原理 三 源代码 四 结果展示 五 备注 一 旅行商问题 1 问题描述 旅
  • 彻底卸载VMware虚拟机

    开始 gt 运行 gt regedit gt 找到HKEY LOCAL MACHINE gt Software gt VMware inc 把这个整个删除 关闭注册表后 重新运行VMware的安装文件 问题即可解决
  • 前端基础面试题(js、vue、react)

    文章目录 vue2面试题 js面试题 react面试题 vue2面试题 vue的双向绑定原理 双向绑定的原理也叫响应式原理 Vue它是采用数据劫持结合发布者 订阅者模式的方式 通过Object defineProperty 属性的sette
  • 【Redis】Centos7 如何正确的手动安装Redis,简单式安装

    安装包 手动官网下载 redis 4 0 1 tar gz 演示redis的版本 使用wget下载 centos 自带了wget wget http download redis io releases redis 4 0 1 tar gz
  • Acwing-870. 约数个数

    N的任何一个约数都是d的形式 而且d每一项的指数都不同 所以N的约数与 1 k的取法是一致的 N的每一个约数都对应了 1 k的一种取法 不同的取法对应不同的约数 由算数基本定理 每一个数的因式分解是唯一的 只要因式分解不一样 那么这两个数就
  • MySQL内置函数ifnull()

    ifnull mysql的一个内置函数 用于处理空值 NULL 如果不为 NULL ifnull 函数会返回第一个参数 否则返回第二个参数 例子 select ifnull select salary from Employee order
  • H5页面唤起关注公众号页面

    一 H5页面唤起关注公众号页面 上面已经说明如何判断用户是否已经关注公众号 那如何唤起关注页面 也就是如何跳转到关注页面引导用户关注呢 主要分为以下几个步骤 1 登录微信公众平台 2 点击微信号头像右击查看源代码 3 找到源代码中以下代码
  • 二极管详解

    一 基本概念 二极管由管芯 管壳和两个电极构成 管芯就是一个PN结 在PN结的两端各引出一个引线 并用塑料 玻璃或金属材料作为封装外壳 就构成了晶体二极管 如下图所示 P区的引出电极称为正极或阳极 N区引出的电极称为负极或阴极 1 二极管的
  • 【LVGL 学习】加入内部字体

    使用到的软件 LvglFontTool exe 字符转换工具 链接 http www lfly xyz forum php mod viewthread tid 24 extra page 3D1 软件界面 按照软件界面配置 1 打开lvg
  • 【卷积神经网络】卷积层,池化层,全连接层

    转于 入门PyTorch 卷积层是卷积神经网络的核心 大多数计算都是在卷积层中进行的 1 卷积层 1 1 概述 首先介绍卷积神经网络的参数 这些参数是由一些可学习的滤波器集合构成的 每个滤波器在空间上 宽度和高度 都比较小 但是深度和输入数
  • Spring Boot + Vue 开发网易云,QQ音乐(附源码)!

    来源 segmentfault com a 1190000021376934 前言 虽然 B S 是目前开发的主流 但是 C S 仍然有很大的市场需求 受限于浏览器的沙盒限制 网页应用无法满足某些场景下的使用需求 而桌面应用可以读写本地文件
  • Markdown嵌入视频

    博客 安卓之家 微博 追风917 CSDN 蒋朋的家 简书 追风917 博客园 追风917 操作 今天看到别人github里可以看youtube视频 小白表示惊呆了有木有 于是乎 于是乎 查看了下人家的代码 表示不懂 然后搜索了下 瞬间正能
  • 职场篇—从网络安全行业人才需求讲个人规划

    如果你是一名正在找工作的网络安全方向大学生 或者是刚刚踏入网络安全领域的新手 这篇文章很适合你 如果你是一名老网安人 看看有哪些你中招了 当你打开BOSS直聘 拉钩等招聘类网站后 在首页的快速导航页面很难找到关于网络安全岗位招聘的引导信息
  • unity 监测UI EventTrigger事件

    如果想控制 只是监听点击一次 设置Image的 Raycast Target 的bool值 这样子就不用反复的注销 注册监听了 注销只在销毁的时候 EventTrigger的所有事件类型 PointerEnter 0 鼠标进入 Pointe
  • DAY10栈与队列:232 用栈实现队列

    一 232 用栈实现队列 class MyQueue public stack
  • Java JDK1.8中类常量池、运行时常量池、字符串常量池所处区域

    类常量池 诞生时间 编译时 所处区域 方法区 类常量池存在Class文件中 一个Class文件对应一个类常量池 储存内容 符号引用和字面量 字符串常量池 诞生时间 编译时 所处区域 堆 储存内容 堆内的字符串对象的引用和字符串常量 运行时常
  • untiy AVProVideo 判断视频是否加载完成,可以播放

    我的插件版本是5 3 不同版本API可能会不同 如果一开就跳转视频 会因为视频没有加载完 导致跳转失败 因此必须等待视频加载完再进行跳转 可以直接等一小会再跳转 但是如果固定等待时间的话 一是每个视频加载耗时不一样 不能精确控制 而是由明显
  • 线性表的顺序结构,C语言实现

    线性表的顺序结构 C语言实现 include