数据结构与算法基础(王卓)(3)

news2024/11/24 15:04:34

前置:

//#include<iostream>
#include<stdlib.h>//存放exit

#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW   -2   

#define MAXlength 100  //初始大小为100,可按需修改

typedef int Status;         //函数调用状态

struct Poly
{
    float p;
    int e;
};

struct Sqlist
{
    Poly* elem;
    int length;
};

二、线性表的销毁

void DestroyList(Sqlist& L)
{
    if (L.elem) delete L.elem;
}

三、线性表的清空

void CLearList(SqList &L)
{
    L.length = 0;
//将线性表的长度设置为0
}

四、线性表是否为空 

int IsEmpty(Sqlist L)
{
    if (L.length == 0)
        return true;
    else
        return false;
}

五、返回线性表元素个数

int Listlength(Sqlist L)
{
    return L.length;
}

、返回线性表第i个元素值

int GetElem(Sqlist L,int i,Poly ele)//element:元素
{
    if (i <= 0 || i > L.length)
        return ERROR;
        ele = L.elem[i-1];
        return OK;
}

int GetElem(Sqlist L,int i,Poly ele)//element:元素
{
    if (i <= 0 || i > L.length)
        return ERROR;
        ele = L.elem[i-1];
        return OK;
}

或者:

bool GetELem(const SqList &L, const size_t i, ElemType &e)
{
    if(i<1 || i>MAXSIZE)
    {
        cerr<<"out of range"<<endl;
        return false;
    }
    e = L.elem[i-1];
    return true;
}

 ele = L.elem[i-1]:

elem是结构体Sqlist里面的一个指针(型)变量成员,指向一个Ploy类型的目标变量

也就是说,其本身就是这个类型的对象的首地址,至于剩下的,就不用我多说了吧

如果还要我说,那就详见:C语言日记 25 指针与数组_宇 -Yu的博客-CSDN博客

这个(以上)算法的复杂度都为常量阶O(1)

顺序表可以随机存取(只要进行一次赋值操作,想要哪个都可以)这是其非常大的优点

比如链表就没有(不能实现)这样的功能

重难点算法:(算法时间复杂度:O(n)

七、查找元素

project1:

int LocateElem(Sqlist L, Poly i)
{
    int a;
    for (a = 0; L.elem[a] != i; a++);
    cout << "元素序号:  " << a << endl;
    // cout<<

}

注意,我们要的,是把所有符合条件的元素筛选出来,而不是只选取第一个:

project2:

int LocateElem(Sqlist L, Poly i)
{
    for (int a = 0; a <= L.length; a++)
    {
        if (i == L.elem[a])
            return a + 1;
        return 0;
    }
}

可结果却显示:

 为什么??? 

完整代码:

#include<stdlib.h>
#include<math.h>//OVERFLOW,exit
#define OK          1
struct Poly
{
    float p;
    int e;
};

struct Sqlist
{
    Poly* elem;
    int length;
};


int LocateElem(Sqlist L, Poly i)
{
    for (int a = 0; a <= L.length; a++)
    {
        if (i == L.elem[a])
            return a + 1;
        return 0;
    }
}

原因不在我写的操作函数里,而是在前面的类体当中;

究其根本原因,还是因为:==不能直接比较结构体,需要手撸比较的工具:

    bool operator==(Poly& t) 
    {
        return t.p == p && t.e == e;
    }

project 3:

#include<math.h>//OVERFLOW,exit
#define OK          1
struct Poly
{
    float p;
    int e;
    bool operator==(Poly& t) 
    {
        return t.p == p && t.e == e;
    }
};

struct Sqlist
{
    Poly *elem;
    int length;
};


int LocateElem(Sqlist L, Poly i)
{
    for (int a = 0; a <= L.length; a++)
    {
        if (i == L.elem[a])
            return a + 1;
        return 0;
    }
}
int main()
{

}

 用while语句实现:

#include<stdlib.h>
#include<math.h>//OVERFLOW,exit
#define OK          1
struct Poly
{
    float p;
    int e;
    bool operator==(Poly& t)
    {    return t.p == p || t.e == e;   }
    bool operator!=(Poly& t)
    {
        return t.p != p && t.e != e;
    }
};

struct Sqlist
{
    Poly* elem;
    int length;
};

int LocateElem(Sqlist L, Poly i)
{
    int a = 0;
    while (a <= L.length && i != L.elem[a])
        a++;
    if(a <= L.length)
        return a + 1;
    return 0;
}
int main()
{

}

八、线性表的插入

project 1:

int ListInsert(Sqlist L,int i,Poly e)
{//insert:插入//i:插入位置(位置序号)
    if (i<1 || i>L.length + 1)
        return ERROR;

    //把插入位置后面的元素全部往后移
    for (int j = L.length - 1; j >= i - 1; j--)//j为下标
        L.elem[j + 1] = L.elem[j];
    //放元素
    L.elem[i-1] =  e;
    return 0;
}

记得(别忘了)写:

    if (L.length == MAXlength)return ERROR;

    L.length++;

project 2:

int ListInsert(Sqlist L,int i,Poly e)
{//insert:插入//i:插入位置(位置序号)
    if (i<1 || i>L.length + 1)
        return ERROR;
    if (L.length == MAXlength)return ERROR;//当前储存空间已满
    //把插入位置后面的元素全部往后移
    for (int j = L.length - 1; j >= i - 1; j--)//j为下标
        L.elem[j + 1] = L.elem[j];
    //放元素
    L.elem[i-1] =  e;
    L.length++;
    return 0;
}

//#include<iostream>
#include<stdlib.h>//存放exit

#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW   -2   

#define MAXlength 100  //初始大小为100,可按需修改

typedef int Status;         //函数调用状态

struct Poly
{
    float p;
    int e;
};

struct Sqlist
{
    Poly* elem;
    int length;
};

int ListInsert(Sqlist L,int i,Poly e)
{//insert:插入//i:插入位置(位置序号)
    if (i<1 || i>L.length + 1)
        return ERROR;
    if (L.length == MAXlength)return ERROR;
    //把插入位置后面的元素全部往后移
    for (int j = L.length - 1; j >= i - 1; j--)//j为下标
        L.elem[j + 1] = L.elem[j];
    //放元素
    L.elem[i-1] =  e;
    L.length++;
    return 0;
}
int main()
{

}

注意:

i:位序;不是下标

j:数组下标(用于访问数据)

L.length:总的元素个数,i的最大值

九、线性表的删除

int ListDelete(Sqlist L,int i)
{
    if (i < 1 || i > L.length )
        return ERROR;
    for (int j = i - 1; j <= L.length-1; j++)
        L.elem[j] = L.elem[j + 1];
    L.length--;
}

按照书上的写法:(不要忘了:    return OK;)

int ListDelete(Sqlist L,int i)
{
    if (i < 1 || i > L.length )
        return ERROR;
    for (int j = i ; j <= L.length; j++)
        L.elem[j-1] = L.elem[j];
    L.length--;
    return OK;
}
bool EraseList(Sqlist &L, const int &i)
{
    //异常判断
    if(i<0 || i>L.length)
    {
        cerr << "wrong erase position!" << endl;
        return false;
    }
    if(L.length == 0)
    {
        cerr << "List has no length" << endl;
        return false;
    }
    //将位于删除位置之后的元素依次向前挪动一位
    for (int p = i + 1; p < L.length; ++p)
    {
        L.elem[p - 1] = L.elem[p];
    }
    //线性表长度-1
    L.length -= 1;
    return true;
    //算法时间复杂度:O(n)
}

有关于线性表的所有基本操作到此为止,完结撒花

下一节,我们开关于链表的学习 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序开发音视频问题汇总及解决方案

目录 问题一&#xff1a;开发音视频&#xff0c;必用的两个小程序组件live-player和live-pusher&#xff0c;他们做什么用的&#xff0c;怎么才能使用&#xff1f; 问题二&#xff1a;一个页面只能插入一个 问题三&#xff1a;真机调试图片预览及视频全屏无反应 问题四&am…

图库 | 图存储的基础概念

前言 图存储的全称叫图数据库存储引擎或图数据库存储层&#xff08;组件&#xff09;。在功能层面&#xff0c;它负责图数据库或图数仓的数据的持久化存储。因为存储距离用户层的应用较图计算更为遥远&#xff0c;过往很少有论著会专门讲述图存储环节&#xff0c;但笔者要说的…

Python搭建虚拟环境

一、简介 1.特点&#xff1a; python的虚拟环境类似于虚拟机&#xff0c;能够创建一个独立的python运行环境&#xff0c; 虚拟环境中的安装的第三方依赖包和全局环境中的包相互独立。 2.环境 1. python3.3以上版本(自带venv模块&#xff0c;若已安装则可直接改变环境变量来…

【软件安装】Linux中RabbitMQ的安装

① 本篇是基于Linux操作系统中的安装&#xff0c;故先准备一个干净的Linux操作系统。本文中所有的操作基于CentOS8进行安装演示&#xff1b; ② 接下来的演示文本中&#xff0c;红色字体为操作步骤&#xff0c;黑色字体为解释说明&#xff1b; ③ 确保Linux系统中已经安装好必…

LightGBM 实现基于内容的个性化推荐

大家好&#xff0c;本文中&#xff0c;我将和大家一起学习如何训练 LightGBM 模型来估计电子商务广告的点击率的推荐系统的例子。将在Criteo数据集上训练一个基于LightGBM的模型。 LightGBM是一个基于树的梯度提升学习算法框架。是基于分布式框架设计的&#xff0c;因而非常高…

汇川伺服电机位置控制模式参数配置

1. 基本控制参数设置 1&#xff09;设置位置控制模式 2&#xff09;绝对值位置线性模式 2.端子输入参数设置 1&#xff09;将输入端子使能失效 3. 位置控制参数设置 1&#xff09;将位置来源设置为2&#xff1a;多段位位置指令 4.通信参数设置 1&#xff09;波特率设置为960…

单元测试我们需要知道哪些?

前言趁着刚读完《认知天性》这书&#xff0c;书有一点这样说&#xff1a;「我们学习行为更多凭着直觉&#xff0c;即使我们已经看到了科学数据&#xff0c;但我们也不愿意去相信自己的直觉存在问题。」那和我们单元测试有什么关系呢&#xff1f;这时我突然有一个问题&#xff1…

19-28-hive-数据类型-DDL

19-hive-数据类型-DDL&#xff1a; 基本数据类型 Hive 数据类型Java 数据类型长度例子TINYINTbyte1byte 有符号整数20SMALINTshort2byte 有符号整数20INTint4byte 有符号整数20BIGINTlong8byte 有符号整数20BOOLEANboolean布尔类型&#xff0c;true 或者falseTRUE FALSEFLOAT…

【Python】Labelme/PIL读取图片朝向错误解决

文章目录一、问题背景二、产生原因三、解决方案一、问题背景 发现使用labelme直接读取含imageData&#xff08;将图片bytes数据使用base64编码后的str数据&#xff09;的json文件时&#xff0c;读上来的图片会发生自动旋转的问题。比如原先是横放的图&#xff0c;读进来后就成…

虚拟化基本知识及virtio-net初探

QEMU/KVM是在Linux中被广泛使用的虚拟化技术之一&#xff0c;而virtio作为一个半虚拟化I/O事实上的标准[1]&#xff0c;是QEMU/KVM在I/O虚拟化部分的默认实现。virtio-net是virtio标准中的网卡设备&#xff0c;被广泛应用。本文将会沿着虚拟化&#xff0c;virtio半虚拟化I/O&am…

非对称风险模型

推荐模型&#xff1a;非对称性风险&#xff0c;让自己置身于一个好结果比坏结果影响大得多的环境中 比如投资&#xff0c;将85%~90%投入到极低风险的资产中&#xff08;国债&#xff09;&#xff0c;来享受确定性收益&#xff1b;剩下的投入的10%~15%投入到极高风险资产中&…

使用FeatureTask多线程优化in,提高查询速度

场景是这样的&#xff1a;使用in查询数据的时候&#xff0c;in的数量越多&#xff0c;效率越低&#xff0c;所以一个优化的思路是&#xff0c;缩小in查询的数量&#xff0c;用多线程的方式查询缩小数量后in的sql&#xff0c;并行查询。 直接上代码&#xff1a; public List&l…

Linux零基础入门(四)Linux实用操作

Linux零基础入门&#xff08;四&#xff09;Linux实用操作前言Linux实用操作一 各类小技巧&#xff08;快捷键&#xff09;1 ctrl c 强制停止2 ctrl d 退出或登出3 历史命令搜索4 光标移动快捷键5 清屏二 软件安装1 Linux系统的应用商店2 yum命令3 apt命令 - 扩展三 systemct…

全光谱台灯对孩子有伤害吗?儿童用台灯的好处和坏处是什么

全光谱台灯是指灯光色谱丰富度与太阳光一般全面的台灯&#xff0c;这样的灯光照射下的任何物体&#xff0c;不但颜色丰富多彩&#xff0c;而且极其真实&#xff0c;无限接近太阳光下的真实色彩&#xff0c;对人眼舒适度有巨大的提升&#xff0c;所以全光谱台灯不但对孩子无害&a…

5G无线技术基础自学系列 | MU-MIMO原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 MU-MIMO是指多个用户在上下行数据传输时…

算法实操:Python代码实现直插排序(含有序在前有序在后)

【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 自学并不是什么神秘的东西&#xff0c;一个人一辈子自学的时间总是比在学校学习的时间长&a…

[附源码]SSM计算机毕业设计音乐网站JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

用结构体解决实际问题中构造数据类型

用结构体解决实际问题中构造数据类型。 实验内容 &#xff08;1&#xff09;题目&#xff1a;编写input()和output()函数输入&#xff0c;输出5个学生的数据记录。学生数据定义如下&#xff1a; #define N 5struct student{ char num[6];char name[8];int score[4];} stu[N];…

anaconda安装paddle(安装CUDA,CUDNN)

前言 为什么会写这样一篇呢&#xff0c;应该早晚会用到paddlelite&#xff0c;所以paddle还是要学的&#xff0c;与其在飞桨平台上跑&#xff0c;不如在自己电脑上跑。我以为安装paddle只需要三行代码&#xff1a; # 打开Anaconda Prompt conda create -n paddle python3.9 c…

C++异常及异常优缺点

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、C语言传统的处理错误的方式二、C异常1.throw catch2.异常的抛出和捕获3.异常的抛出和捕获原则4.函数调用链 异常 栈展开匹配原则5.异常的…