快速利用c语言实现线性表(lineList)

    线性表是数据结构中最基本和简单的一个,它是n的相同类型数据的有序序列,我们也可以用c语言中的数组来理解线性表。

一、线性表声明

    我们定义一个线性表的结构体,内部有三个元素:其中elem是一个指针,指向线性表的头,length记录线性表元素个数,listsize记录线性表的总长度。

//
// Created by 111 on 2024/11/15.
//

#ifndef TEST1_LINELIST_H
#define TEST1_LINELIST_H

#define OK 1
#define ERROR 0

#define LIST_INIT_SIZE  30 //初始化线性表大小
#define LIST_INCREMENT  10 //线性表长度不够时,每次动态增加的长度


typedef struct
{
    int *elem;    //指向线性表的头
    int length;    //线性表元素个数
    int listsize;  //线性表总长度
}LineList;



int initLineList(LineList *);


int lineListInsert(LineList *,int,int);

int lineListDelete(LineList *,int);

int printLineList(LineList *);

int freeLineList(LineList *);

int lineListLocateElem(LineList *,int elem);


#endif //TEST1_LINELIST_H

二、线性表初始化

    我们通过初始化函数,进行线性表的空间申请,一开始我们申请可以存有30个元素的线性表,具体函数如下:

int initLineList(LineList *L)
{
    L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int)); //动态申请堆空间,初始化30个元素
    if(!L->elem)
    {
        printf("LineList allocate failed!"); //申请失败,提示错误,推出程序
        exit(ERROR);
    }
    L->length = 0; //记录元素个数
    L->listsize = LIST_INIT_SIZE; //记录线性表总大小

    return OK;
}

三、插入元素

    插入元素我们通过指定位置进行插入,如果插入位置超过元素最大位置+1,则抛错;如果中间位置进行元素插入,我们则需要将后面的元素进行后移。

int lineListInsert(LineList *L,int i,int newelem)
{
    int *tmpaddr;  //用来存放扩展后的线性表地址
    int *tmpdata;  //用来存放临时元素的地址
    int *q;
    if(i<1||i>L->length+1) //如果超过位置,则报错
        return ERROR;
    if(L->length>=L->listsize)
    {
        tmpaddr = (int *)realloc(L->elem,(L->listsize+LIST_INCREMENT)*sizeof(int));//元素个数超过线性表最大大小,则进行动态扩展
        if(!tmpaddr)
        {
            printf("linesize reallocate failed!\n");
            exit(ERROR);
        }
        L->elem = tmpaddr;//线性表新地址
        L->listsize += LIST_INCREMENT;//线性表总大小该表
    }
    tmpdata =(L->elem+i-1);
    for(q = (L->elem+L->length-1);q>=tmpdata;--q) //从线性表最后一个元素开始,进行元素后移
        *(q+1) = *q; //插入元素

    *tmpdata = newelem;
    ++L->length;

    return OK;
}

四、删除元素

    删除一个元素后,我们需要将后续的元素进行前移动,确保线性表的连续:

int lineListDelete(LineList *L,int index)
{
    if(index<1||(index>L->length)) //错误的位置,返回ERROR
    {
        return ERROR;
    }
    int *tmpdel = L->elem+index; //临时存放删除元素的后一个元素
    int *mp = L->elem + L->length -1; //指向最后一个元素
    for(tmpdel;tmpdel<=mp;++tmpdel){  //从删除位置开始,进行元素前移
        *(tmpdel-1)= *tmpdel;
    }
    --L->length;
    return OK;

}

五、元素定位

    返回第一个匹配元素的位置,如果都不匹配,则返回0.

int lineListLocateElem(LineList *L,int elem)
{
    int i=1;
    int *p = L->elem;
    while(i<=L->length&&(*p++)!=elem)
        ++i;
    if(i<=L->length)
        return i;
    else
        return 0;
}

六、打印线性表

int printLineList(LineList *L)
{
    int *p = L->elem;
    for(int i =0 ;i<L->length;i++)
    {
        printf("the %d element is %d\n",(i+1),*(L->elem+i));
    }
    return OK;
}

七、释放空间

int freeLineList(LineList *L)
{
    free(L->elem);
    return OK;
}

八、测试

    我们在main函数中进行测试的编写,验证上述函数的功能。

int main() {

    LineList l;
    initLineList(&l);
    lineListInsert(&l,1, 10);
    lineListInsert(&l,2, 18);
    lineListInsert(&l,2,20);
    printLineList(&l);
    lineListDelete(&l,2);
    printf("after the linelist deleted.....\n");
    printLineList(&l);
    freeLineList(&l);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Python+CNN卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

QT QLineEdit失去焦点事件问题与解决

本文介绍如何获得QLineEdit的失去焦点事件和获得焦点的输入框也会触发失去焦点事件的问题&#xff01; 目录 一、QLineEdit获得失去焦点事件 1.自定义类继承自QLineEdit 2.重写 focusOutEvent 3.使用 二、失去焦点事件问题 1.问题描述 2.问题解决 三、源码分享 lineed…

vscode执行npm install报错

npm install一直提示报错 以管理员身份运行vscode&#xff0c;如果每次觉得很麻烦可以做如下修改&#xff1a;

【算法】树状数组

前言 众所周知&#xff0c;通过前缀和&#xff0c;我们可以很快的在一个很大的数组中求出区间和&#xff0c;但是如果想要去修改数组中的一个数的值&#xff0c;前缀和就无法实现。所以来学习一个新的数据结构&#xff1a;树状数组 &#xff08;文章中关于树状数组的截图来自于…

Java项目实战II基于微信小程序的私家车位共享系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在城市化进…

ZeroSSL HTTPS SSL证书ACMESSL申请3个月证书

目录 一、引言 二、准备工作 三、申请 SSL 证书 四、证书选型 五、ssl重要性 一、引言 目前免费 Lets Encrypt、ZeroSSL、BuyPass、Google Public CA SSL 证书&#xff0c;一般免费3-6个月。从申请难易程度分析&#xff0c;zerossl申请相对快速和简单&#xff0c;亲测速度非…

pipx安装提示找不到包

执行&#xff1a; pipx install --include-deps --force "ansible6.*"WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnectionError(<pip._vendor.urllib3.connection.HTTPSConnection …

react + ts定义接口类型写法

接口&#xff08;未进行ts定义&#xff09; export async function UserList(params: {// keyword?: string;current?: number;pageSize?: number;},// options?: { [key: string]: any }, ) {return request<API1.UserList>(http://geek.itheima.net/v1_0/mp/artic…

Golang超详细入门教程

Golang超详细入门教程 部分图片可能加载不出来&#xff0c;所以这里我上传到了自己的个人网站上也可以查看&#xff1a;http://dahua.bloggo.chat/testimonials/490.html 一、数据类型转换 C语言中数据可以隐式转换或显示转换, 但是Go语言中数据只能显示转换格式: 数据类型(…

Cannot resolve org.apache.tomcat.embed:tomcat-embed-core:9.0.60标红解决办法

解决方法是&#xff1a; MyBatis 会扫描这个包下的所有接口&#xff0c;并将这些接口注册为 MyBatis 的 Mapper。 把这个加上后&#xff0c;问题解决&#xff01;

游戏引擎学习第九天

视频参考:https://www.bilibili.com/video/BV1ouUPYAErK/ 修改之前的方波数据&#xff0c;改播放正弦波 下面主要讲关于浮点数 1. char&#xff08;字符类型&#xff09; 大小&#xff1a;1 字节&#xff08;8 位&#xff09;表示方式&#xff1a;char 存储的是一个字符的 A…

C#设计模式(12)——享元模式(Flyweight Pattern)

前言 享元模式通过共享对象来减少内存使用和提高性能。 代码 public abstract class Flyweight {public abstract void Control(); }public class ComputerFlyweight : Flyweight {private string _operator;public ComputerFlyweight(string name){_operator name;}public o…

upload-labs通关练习

目录 环境搭建 第一关 第二关 第三关 第四关 第五关 第六关 第七关 第八关 第九关 第十关 第十一关 第十二关 第十三关 第十四关 第十五关 第十六关 第十七关 第十八关 第十九关 第二十关 总结 环境搭建 upload-labs是一个使用php语言编写的&#xff0c…

【云原生系列--Longhorn的部署】

Longhorn部署手册 1.部署longhorn longhorn架构图&#xff1a; 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi &#xff0c;Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…

Elastic Agent:可灵活地在任何地方发送和处理任何数据

作者&#xff1a;来自 Elastic Nima Rezainia Elastic Agent 是一款功能强大且用途广泛的工具&#xff0c;可用于从各种数据源&#xff08;包括自定义用户应用程序&#xff09;收集日志和指标。现在&#xff0c;Elastic Agent 提供了无与伦比的灵活性&#xff0c;可以将数据准确…

一、HTML

一、基础概念 1、浏览器相关知识 这五个浏览器市场份额都非常大&#xff0c;且都有自己的内核。 什么是内核&#xff1a; 内核是浏览器的核心&#xff0c;用于处理浏览器所得到的各种资源。 例如&#xff0c;服务器发送图片、视频、音频的资源&#xff0c;浏览…

IDEA旗舰版编辑器器快速⼊门(笔记)

简介&#xff1a;javaweb开发必备软件之IDEA期间版介绍 DEA编辑器器版本介绍 官⽹网&#xff1a;https://www.jetbrains.com/地址&#xff1a;https://www.jetbrains.com/idea/download/#sectionmac DEA 分社区版(Community) 和 旗舰版(Ultimate)&#xff0c;我们做JavaWeb开…

【鸿蒙开发】第十五章 H5与端侧交互、Cookies以及Web调试

目录 1. H5与端侧交互 1.1 应用侧调用前端页面函数 1.2 前端页面调用应用侧函数 1.2.1 复杂类型使用方法 1.3 建立应用侧与前端页面数据通道 2 管理页面跳转及浏览记录导航 2.1 历史记录导航 2.2 页面跳转 2.3 跨应用跳转 3 管理Cookie及数据存储 3.1 Cookie管理 3…

【优选算法】双指针

目录 一、[移动零](https://leetcode.cn/problems/move-zeroes/description/)二、[复写零](https://leetcode.cn/problems/duplicate-zeros/description/)三、[快乐数](https://leetcode.cn/problems/happy-number/)四、 [盛最多水的容器](https://leetcode.cn/problems/contai…

C++常用的特性-->day05

友元的拓展语法 声明一个类为另外一个类的友元时&#xff0c;不再需要使用class关键字&#xff0c;并且还可以使用类的别名&#xff08;使用 typedef 或者 using 定义&#xff09;。 #include <iostream> using namespace std;// 类声明 class Tom; // 定义别名 using …