线性顺序表算法库

list.cpp 具体函数实现

#include <stdio.h>
#include "list.h"
#include <malloc.h>


/**************************************************
①函数名: CreateList
功  能: 用数组构建顺序表
参  数: ①SqList *&L:传入的线性表 ②ElemType a[]:使用的数组
		③int n: 线性表的长度(n < Maxsize)
返回值: 无
**************************************************/
void CreateList(SqList *&L, ElemType a[],int n)
{
	int i;
	//分配空间
	L = (SqList*)malloc(sizeof(SqList));
	for(i = 0; i<n; i++)
	{
		L->data[i] = a[i];
	}
	L->length = n;
}

/**************************************************
②函数名: InitList
功  能: 初始化线性表,重新分配空间,长度清成零
参  数: ①SqList *&L:要进行初始化的线性表
返回值:  无
**************************************************/

void InitList(SqList *&L)
{
	L = (SqList*)malloc(sizeof(SqList)); //既然初始化了,直接重新分配空间
	L->length = 0;

}


/**************************************************
③函数名: 		DispalyList
功  能: 	输出数组线性表到控制台
使用场景: 	调试输出专用
参  数: 	①SqList *L:所需展示的顺序表
返回值:		void
**************************************************/
void DispalyList(SqList *L)
{
	if(L->length == 0) return;
	for(int i = 0; i< L->length; i++)
	{
		printf("%d ",L->data[i]);
	}
	printf("\n");
}

/**************************************************
④函数名: 	ListEmpty
功  能: 判断顺序表是否为空
参  数: ① SqList *L: 需要判断的顺序表
返回值: (bool类型)  是空表 ? 返回1  : 不是返回0
**************************************************/
bool ListEmpty(SqList *L)
{
    return(L->length == 0);
}

/**************************************************
⑤函数名 : DestroyList
功  能: 释放顺序表空间
参  数: ① SqList *&L: 所需释放的线性表的指针地址
注  意: (1)
返回值:  无
**************************************************/
void DestroyList(SqList *&L) //(1)注意是指针地址
{
	//c语言, 直接free
	free(L);

}

/**************************************************
⑥函数名:ListLength
功  能: 返回顺序表长度
参  数: ① SqList *L:传入顺序表的名字
返回值:  int: 线性表长度值
**************************************************/
int ListLength(SqList *L)
{
    return (L->length);
}

/**************************************************
⑦函数名:GetElem
功  能: 取线性表数组内,某个序号的元素值,并返回
参  数: ①SqList *L: 要取的线性表 ②int i:要取的序号(逻辑需要 1-n)
        ③ElemType &e:返回到特定位置
注意:①合法性判断 ②   需要把逻辑(1~n)变成物理序号(0~n-1)
返回值:	bool:是否获取成功
**************************************************/
bool GetElem(SqList *L,int i, ElemType &e)
{
    if(i<1 || i>L->length)//①
    {
        return false;
    }
    e = L->data[i-1];  //②
    return true;
}

/**************************************************
⑧函数名: LocateElement
功  能: 查找特定元素值,在线性表中的位置(1~n)
参  数: ①ElemType element: 特定元素值 ② SqList *L:被查的线性表
返回值: int: 位置信息 (0没找到, 1~n, 即为位置)
**************************************************/
int LocateElement(ElemType element, SqList *L)
{
    int i = 0;
    while(i < L->length && L->data[i] != element) i++;
    //如果 i跳出后, i范围超过 L->length,则 没找到
    if(i >= L->length) return 0;
    else   return i+1;

}
/**************************************************
函数名: ListInsert
功  能: 把 e 插到到线性表 L 的第 i(逻辑序号) 个位置
参  数: (1)SqList *&L: 线性表L (2)int i: 插入到的逻辑位置
        (3) ElemType e:要插入的元素值
注意:① 可插入的位置逻辑序号为1~L->length+1
        ②得出 j最后是等于 i+1, 所以j的范围是 j>i
        ③从 j=L->length得出 , data[j] = data[j-1],从而确定整体范围
返回值: bool:是否插入完成
**************************************************/
bool ListInsert(SqList *&L,int i, ElemType e)
{
    int j;
    if(i<1 || i>L->length+1)    //①
        return false;
    i--;        //将顺序表的逻辑序号转化为物理序号
    for(j = L->length; j > i; j--)  //② data[i+1] = data[i] => j = i+1
    {
        //③ data[i]~data[L->length-1]整体后移到data[i+1]~data[L->length]
        L->data[j] = L->data[j-1];
    }
    L->data[i] = e;     //插入元素e
    L->length++;        //顺序表插入增1
    return true;       //成功插入返回true

}

/**************************************************
函数名: ListDelete
功  能: 删除顺序表特定位置的元素
参  数: (1)SqList *&L:被删的顺序表 (2)int i:位置
        (3)ElemType &e:删掉的值
注 意:  ① 思路是整体前移,所以确定初始值i,然后定公式,看临界定 范围
        ② 最后一个是 data[L->length-2] = data[L->length-1],
            得出 j = L->length-2
返回值: bool:是否删除成功? true : false
**************************************************/
bool ListDelete(SqList *&L, int i, ElemType &e)
{
    int j;
    if(i < 1 || i > L->length) return false;
    i--;    //把逻辑序号转为物理序号
    e = L->data[i]; //将要删除的元素存储
    for(j = i;j < L->length-1; j++)//①将data[i...n-1]整体前移
    {
    //② data[i+1]~data[L->length-1] => data[i] ~ data[L->length-2]
        L->data[j] = L->data[j+1];
    }
    L->length--;    //顺序表长度减去1
    return true;
}

list.h 算法库头文件

#ifndef LIST_H_INCLUDE
#define LIST_H_INCLUDE

#define MaxSize   100

typedef int ElemType;	//自定义类型

typedef struct			//自定义结构体
{
	ElemType data[MaxSize];
	int length;
}SqList;

//①用数组创建线性表
void CreateList(SqList *&L, ElemType a[],int n);
//②初始化线性表
void InitList(SqList *&L);
//③输出线性表
void DispalyList(SqList *L);
//④判断是否为空表
bool ListEmpty(SqList *L);
//⑤销毁线性表
void DestroyList(SqList *&L);

//⑥ 求线性表的长度
int ListLength(SqList *L);

//⑦求某个位置的数据元素值GetElem(L,i,e)
bool GetElem(SqList *L,int i, ElemType &e);

//⑧ 元素 e 在 L中的序号(逻辑序号 1~n)
int LocateElement(ElemType element, SqList *L);

//⑨ L中 第 i 位, 插入 e, ListInsert(L,i,e)
bool ListInsert(SqList *&L,int i, ElemType e);

//⑩ 删除 L 中特定位置 i 的元素 e,  ListDelete(L,i,e)
bool ListDelete(SqList *&L, int i, ElemType &e);

#endif


main.cpp  测试函数

#include "list.h"
#include "stdio.h"
int main()
{
	SqList *sq;
	//②初始化线性表
    InitList(sq);
    //判断是否初始化后是空表
    if(ListEmpty(sq))
    {
        printf("初始化过后是空表\n");
    }
	ElemType elem;
	ElemType x[8] = {1,2,3,4,5,6,7,8};
	ElemType y[8] = {9,8,7,6,5,4,3,2};
    //①用数组创建线性表
    CreateList(sq, x,8);
    if(ListEmpty(sq) != 1)
    {
        printf("新建后不是空表\n");
    }
    //③输出线性表
    DispalyList(sq);
④判断是否为空表
//bool ListEmpty(SqList *L);
//⑤销毁线性表
    DestroyList(sq);
    printf("空间释放后,输出看看啥情况\n");
    DispalyList(sq);
    CreateList(sq,y,8);
    //⑥ 求线性表的长度
    printf("新建一个y表,求一下长度是%d\n",ListLength(sq));



//⑦求某个位置的数据元素值GetElem(L,i,e)
    if(GetElem(sq,1, elem))
    {
            printf("新y表第一个元素是%d\n",elem);
    }

//⑧ 元素 e 在 L中的序号(逻辑序号 1~n)
    elem = LocateElement(6, sq);
    printf("6在y的第%d个位置\n",elem);

    if(ListDelete(sq, 3, elem))
    {
        printf("删除y的第三个元素%d,然后再输出一下y:\n",elem);
        DispalyList(sq);
    }

    //⑨ L中 第 i 位, 插入 e, ListInsert(L,i,e)
    if(ListInsert(sq,3,elem))
    {
        printf("再插入,就是玩,展示:\n");
        DispalyList(sq);
    }

	return 0;
}

演示结果:

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

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

相关文章

打造新质生产力,亚信科技2024年如何行稳致远?

引言&#xff1a;不冒进、不激进&#xff0c;稳扎稳打&#xff0c; 一个行业一个行业地深度拓展。 【全球云观察 &#xff5c; 科技热点关注】 基于以往“一巩固、三发展”的多年业务战略&#xff0c;亚信科技正在落实向非通信行业、标准产品、软硬一体产品和国际市场的“四…

CrossOver 23 用户可以免费升级到 CrossOver24吗?CrossOver用户如何升级呢?

也就是上个月&#xff08;2024年2月底&#xff09;左右&#xff0c;CrossOver 刚刚更新了 24 版本&#xff0c;CrossOver更新的内容有哪些&#xff0c;大家可以参考这篇文章&#xff1a;CrossOver24.0新功能介绍&#xff0c;这篇文章详细介绍了CrossOver24有哪些新特点&#xf…

Java最后一块石头的重量 II(力扣Leetcod1049)

最后一块石头的重量 II 力扣原题 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结…

2核4G服务器优惠价格和性能测试,2024年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

软考90-上午题-【操作系统】-死锁

一、同类资源分配不当引起死锁 系统中有m个资源&#xff0c;被n个进程共享&#xff0c;每个进程都要求k个资源。 当m < n*k时&#xff0c;即&#xff1a;资源数<进程所要求的总数时&#xff0c;可能会引起死锁。&#xff08;但是不一定&#xff01;&#xff09; 例如&…

Android - 深入浅出理解SeLinux

1. 概述 官方文档&#xff1a; https://source.android.com/docs/security/features/selinux https://source.android.com/docs/security/features/selinux/images/SELinux_Treble.pdf Your visual how-to guide for SELinux policy enforcement | Opensource.com SeLinux&…

基于Springboot的西安旅游系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的西安旅游系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

多线程(CAS, ABA问题, Runnable Callable)

CAS (Compare And Swap) 比较并交换, 可以理解成是 CPU 提供一种特殊指令, 该指令是原子的, 可以用其一定程度解决线程安全问题, 具体过程如下 假设内存中有原数据 V, 寄存器中有旧的预期值 A 和修改值 B 比较 V 与 B 的值是否相等如果相等, 则将 B 写入 V返回操作是否成功 上述…

局部路径规划算法 - 多项式曲线法

参考&#xff1a;局部路径规划算法——曲线插值法 0 前言 1 多项式曲线法 1.1 算法简介 曲线插值的方法是按照车辆在某些特定条件&#xff08;安全、快速、高效&#xff09;下&#xff0c;进行路径的曲线拟合&#xff0c;常见的有多项式曲线、双圆弧段曲线、正弦函数曲线、…

2024蓝桥杯每日一题(递归)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;有序分数 试题二&#xff1a;正则问题 试题三&#xff1a;带分数 试题四&#xff1a;约数之和 试题五&#xff1a;分形之城 试题一&#xff1a;有序分数 【题目描述】 【输入格…

“轻”装上阵!BIM模型“瘦身”计划

您的企业在使用轻量化云平台吗&#xff1f;主要用来做什么&#xff1f;根据《中国BIM发展报告2024》调查显示&#xff0c;58%的企业正在使用BIM 轻量化。其中&#xff0c;高达83.6%的用户&#xff0c;主要是为了解决模型的轻量化查看问题。BIM轻量化是什么&#xff1f;除了轻量…

Mq之pulsar的入门使用(一)

目录 一、linux集群安装pulsar 注意事项 编辑 /etc/hostname与/etc/hosts 执行初始化命令 二、创建应用程序对消息的生产和消费进行测试 物理主机启动应用发送消息时报错处理程序的搭建及说明使用到的pom依赖springboot中pulsar配置接收消息模拟发送消息发送与接收消息打印…

HTML网页文档和DOM结构介绍

HTML网页文档和DOM结构介绍 HTML网页文档 HTML&#xff0c;全称为超文本标记语言&#xff08;Hypertext Markup Language&#xff09;&#xff0c;是用来描述并定义内容结构的标记语言&#xff0c;它是构建任何网页和网络应用的最基础的组成部分。HTML文档由一系列的元素构成…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.2 组织结构

在SAP的FI模块&#xff0c;主要的组织结构有公司代码&#xff08;一定会用&#xff09;、公司&#xff08;只在做合并业务时用&#xff09;、业务范围&#xff08;可能使用&#xff09;、段&#xff08;较少使用&#xff09;、利润中心&#xff08;可能使用&#xff09;。 2.2…

二叉树|257.二叉树的所有路径

力扣题目链接 class Solution { private:void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val); // 中&#xff0c;中为什么写在这里&#xff0c;因为最后一个节点也要加入到path中 // 这才到了叶子节…

ThingsBoard初始化数据库Postgres+Cassandra

本章将介绍ThingsBoard初始化数据PostgresCassandra&#xff0c;两种数据库结合使用&#xff0c;以及源码的编译安装。本机环境&#xff1a;Centos7、Docker、Postgres、Cassandra 环境安装 开发环境要求&#xff1a; docker &#xff1b;Docker&#xff1b;Postgres:Cassandr…

为车主提供多路况安全保障!“北欧轮胎安全专家”熊牌轮胎迎来全新升级

德国马牌轮胎旗下明星品牌——Gislaved熊牌轮胎迎来全新升级。 自进入中国市场以来&#xff0c;熊牌轮胎凭借着坚韧安全、静音降噪等特点&#xff0c;收获无数好评。此次全新升级的熊牌轮胎&#xff0c;在品牌logo中加入了“北欧棕熊”的形象&#xff0c;并且对此前轮胎标签中的…

哨兵位、链表的链接

哨兵位&#xff1a; 通俗的话讲就是额外开辟一块空间&#xff0c;指向链表的头部。 合并两个有序链表 已解答 简单 相关标签 相关企业 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#…

PID算法原理分析及优化

今天为大家介绍一下经典控制算法之一的PID控制方法。PID控制方法从提出至今已有百余年历史&#xff0c;其由于结构简单、易于实现、鲁棒性好、可靠性高等特点&#xff0c;在机电、冶金、机械、化工等行业中应用广泛。 在大学期间&#xff0c;参加的智能汽车竞赛中就使用到了PI…

1. Java基础入门

1. Java基础入门 1.1 Java介绍(了解) 1.1.1 Java背景 Java是美国 sun 公司&#xff08;Stanford University Network&#xff09;在1995年推出的一门计算机高级编程语言。Java 之父&#xff1a;詹姆斯高斯林(James Gosling)。 2009年 sun公司被Oracle公司收购。Java公司图标…
最新文章