C++ 顺序线性表的功能

顺序线性表的功能

//头文件 
#pragma once

#define LIST_INIT_SIZE   50
#define LIST_INCREMENT   20
#define OK 1
#define ERROR 0

typedef int Status;

typedef char ElemType;

typedef struct list_ {
	ElemType* elem;
	int length;
	int listize;
}SqList;

// 1 初始化 函数
Status InitList_Sq(SqList& L);

//2 想第i个位置插入数据
Status ListInsert_Sq(SqList& L, int i, ElemType e);


//3 显示所有元素
void PrintAll(SqList L, void print(ElemType));

//4 获取第i个元素的值
Status GetElem(SqList L, int i, ElemType& e);

//5 打印一个元素
void PrintOne(ElemType e);

//删除 第i个位置的元素
Status ListDelete(SqList& L, int i, ElemType& e);

// 用完释放
void DestroyList(SqList& L);

//获取e所在下标

size_t LocateElem(SqList L,ElemType e);
#include <stdio.h>
#include <stdlib.h>
#include "mylist.h"


Status InitList_Sq(SqList& L) {
	L.elem = (ElemType*)malloc(sizeof(ElemType) * LIST_INIT_SIZE);

	if (!L.elem)
		return ERROR;

	L.length = 0;
	L.listize = LIST_INIT_SIZE;
	return OK;
}

Status ListInsert_Sq(SqList& L, int i, ElemType e) {
	// i必须大于0 ,小于等于 L.length + 1
	if (i<1 || i> L.length + 1)
		return ERROR;

	// 位置合理,空间不够
	if (L.length >= L.listize) {//扩空间
		ElemType* newbase = (ElemType*)realloc(L.elem, sizeof(ElemType) * (L.listize + LIST_INCREMENT));
		if (!newbase)
			exit(-1);
		L.elem = newbase;
		L.listize += LIST_INCREMENT;
	}

	ElemType* p;
	p = L.elem + (i - 1);
	p = &(L.elem[i - 1]);
	for (ElemType* q = L.elem + (L.length - 1); q >= p; q--)
		*(q + 1) = *q;

	*p = e;
	L.length += 1;

	return OK;
}
void PrintAll(SqList L, void print(ElemType)) {
	for (size_t i = 0; i < L.length; i++) {
		print(L.elem[i]);
	}
	printf("\n");
}
Status GetElem(SqList L, int i, ElemType& e) {
	// i必须大于0 ,小于等于 L.length 
	if (i<1 || i> L.length)
		return ERROR;
	e = L.elem[i - 1]; //e = *(L.elem + i - 1);	
	return OK;
}

void PrintOne(ElemType e) {
	printf("%d ", e);
}

Status ListDelete(SqList& L, int i, ElemType& e) {
	// i必须大于0 ,小于等于 L.length 
	if (i<1 || i> L.length)
		return ERROR;

	e = L.elem[i - 1]; //e = *(L.elem + i - 1);	
	for (ElemType* p = L.elem + i - 1; p < L.elem + L.length; p++)
		*p = *(p + 1);
	L.length--;

	return OK;
}

void DestroyList(SqList& L) {
	free(L.elem);
	L.length = 0;
	L.listize = 0;
}

size_t LocateElem(SqList L, ElemType e){	
	for (size_t i = 0; i < L.length; i++) {
		if (L.elem[i] == e) {
			return i + 1;
		}
	}
	return 0;
}

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

// a = a U b
void unionSet(SqList& a, SqList b);

void unionSet(SqList& a, SqList b) {
	//遍历b
	for (size_t i = 1; i <= b.length; i++) {//i代表位置,并非下标(从1开始),length不代表下标
		ElemType e;
		GetElem(b, i,e);
		//询问 e 是否在 a集合
		if (!LocateElem(a, e)) {
			ListInsert_Sq(a, a.length+1, e);
		}
	}
}



int main() {//2024-5-5
	SqList a, b;
	InitList_Sq(a);
	InitList_Sq(b);
	ListInsert_Sq(a, 1, 1);
	ListInsert_Sq(a, 2, 2);
	ListInsert_Sq(a, 3, 3);
	ListInsert_Sq(a, 4, 4);
	ListInsert_Sq(a, 5, 5);

	ListInsert_Sq(b, 1, 1);
	ListInsert_Sq(b, 2, 3);
	ListInsert_Sq(b, 3, 9);
	ListInsert_Sq(b, 4, 10);

	puts("A原来:");
	PrintAll(a,PrintOne);

	puts("B原来:");
	PrintAll(b, PrintOne);

	unionSet(a,b);

	puts("A现在:");
	PrintAll(a, PrintOne);


	return 0;
}


int main1() { //2024-5-4
	SqList L;
	if (!InitList_Sq(L)) {
		printf("线性表建立失败,程序退出。");
		exit(-1);
	}

	ListInsert_Sq(L,1,100);
	ListInsert_Sq(L, 2, 101);
	ListInsert_Sq(L, 3, 102);
	ListInsert_Sq(L, 4, 103);
	ListInsert_Sq(L, 5, 104);
	ListInsert_Sq(L, 6, 105);
	ListInsert_Sq(L, 7, 106);
	PrintAll(L,PrintOne);

	char e;
	GetElem(L, 2,e);
	PrintOne(e);
	printf("\n");

	ListDelete(L,2,e);
	puts("现在的列表:");
	PrintAll(L,PrintOne);

	printf("刚才删除的元素是:\n");
	PrintOne(e);
	printf("\n");


	return 0;
}

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

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

相关文章

Xinstall广告效果监测,助力广告主优化投放策略

在移动互联网时代&#xff0c;APP推广已成为企业营销的重要手段。然而&#xff0c;如何衡量推广效果&#xff0c;了解用户来源&#xff0c;优化投放策略&#xff0c;一直是广告主和开发者面临的难题。这时&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&#xff0c;以…

SpringBoot项目部署到阿里云服务器

部署步骤 步骤分以下&#xff1a; 将SpringBoot项目打包Linux上准备好Java环境、可用的MySql数据库项目上传到服务器启动项目停止项目 1.SpringBoot项目打包 数据库的链接&#xff0c;账户和密码需要和Linux上一致。 如上图打包即可。 2.Linux上准备好Java环境以及Mysql环境…

微生物群落构建(community assembly)

Introduction Zhou, J. & Ning, D. Stochastic Community Assembly: Does It Matter in Microbial Ecology? Microbiol Mol Biol Rev 81, e00002-17 (2017). This review is very comprehensive (1)&#xff01; 周集中老师实验室的长期研究兴趣集中在从基因组到生态系统…

ZIP压缩输出流(将ZIP文件解压)

文章目录 前言一、ZIP压缩输出流是什么&#xff1f;二、使用介绍 1.使用方法2.实操展示总结 前言 该篇文章相对应的介绍如何使用java代码将各种文件&#xff08;文件夹&#xff09;从ZIP压缩文件中取出到指定的文件夹中。解压流将ZIP文件中的文件以条目的形式逐一读取&#xff…

WMS仓储管理系统库存分类的详细讲解

在当今日益复杂和快速变化的商业环境中&#xff0c;仓库管理成为了一个企业不可或缺的关键环节。WMS仓储管理系统解决方案凭借其自动化和信息化的优势&#xff0c;为企业带来了革命性的改变&#xff0c;特别是在库存分类方面。接下来&#xff0c;我们将深入探讨WMS仓储管理系统…

LLMs之GPT4ALL:GPT4ALL的简介、安装和使用方法、案例应用之详细攻略

LLMs之GPT4ALL&#xff1a;GPT4ALL的简介、安装和使用方法、案例应用之详细攻略 目录 GPT4ALL的简介 0、新功能 1、特点 2、功能 3、技术报告 GPT4ALL的安装和使用方法 1、安装 2、使用方法 GPT4ALL的案例应用 LLMs之LLaMA3&#xff1a;基于GPT4ALL框架对LLaMA-3实现…

【笔记】Anaconda命令提示符(Anaconda Prompt)操作

通过anaconda配置python环境有时需要conda安装一些包或者文件&#xff0c;这里作为一个笔记记录如何打开Anaconda命令提示符&#xff08;Anaconda Prompt&#xff09;&#xff0c;并用conda操作 1.打开Anaconda命令提示符&#xff08;Anaconda Prompt&#xff09; 可直接在搜…

如何获得一个Oracle 23ai数据库(RPM安装)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 方法包括3种&#xff0c;本文介绍第2种&#xff1a; Virtual ApplianceRPM安装Docker RPM安装支持Linux 8和Linux 9。由于官方的Vi…

人工智能|机器学习——强大的 Scikit-learn 可视化让模型说话

一、显示 API 简介 使用 utils.discovery.all_displays 查找可用的 API。 Sklearn 的utils.discovery.all_displays可以让你看到哪些类可以使用。 from sklearn.utils.discovery import all_displays displays all_displays() displays Scikit-learn (sklearn) 总是会在新版本…

Stack数据结构设计模板

第三章 栈、队列、数组 1.栈 1.1 顺序栈 #define MaxSize 20 typedef int ElemType; //顺序栈的定义 typedef struct {ElemType data[MaxSize];int top; }SqStack; // 初始化顺序栈 void InitSqStack(SqStack &S){S.top -1; }; // 入栈(增) bool Push(SqStack &S,El…

推荐5个免费的国内平替版GPT

提起AI&#xff0c;大家第一个想到的就是GPT。 虽然它确实很厉害&#xff0c;但奈何于我们水土不服&#xff0c;使用门槛有些高。 不过随着GPT的爆火&#xff0c;现在AI智能工具已经遍布到各行各业了&#xff0c;随着时间的推移&#xff0c;国内的AI工具也已经“百花盛放”了…

【R语言从0到精通】-4-回归建模

通过之前的文章&#xff0c;我们已经基本掌握了R语言的基本使用方法&#xff0c;那从本次教程开始&#xff0c;我们开始聚焦如何使用R语言进行回归建模。 4.1 回归简介 回归分析是一种统计学方法&#xff0c;用于研究两个或多个变量之间的相互关系和依赖程度。它可以帮助我们了…

Java性能优化(一):Java基础-ArrayList和LinkedList

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…

数控六面钻适用场景-不止家具制造

在快节奏的现代生活中&#xff0c;家具作为我们生活的重要组成部分&#xff0c;其美观度和实用性日益受到人们的关注。而在这背后&#xff0c;一个不可或缺的“工匠”正默默地发挥着它的作用——那就是数控六面钻。 数控六面钻&#xff0c;顾名思义&#xff0c;是一种高度自动…

OS复习笔记ch5-2

引言 在上一篇笔记中&#xff0c;我们介绍到了进程同步和进程互斥&#xff0c;以及用硬件层面上的三种方法分别实现进程互斥。其实&#xff0c;软件层面上也有四种方法&#xff0c;但是这些方法大部分都存在着一些问题&#xff1a; “上锁”与“检查”是非原子操作&#xff0…

error: pathspec ‘XXX‘ did not match any file(s) known to git

使用vscode&#xff0c;在本地开发切换分支时&#xff0c;报以下错误&#xff1a; error: pathspec XXX did not match any file(s) known to git 该问题是由于没有对应分支的原因。 首先使用一下命令&#xff0c;查看本地及远程的所有分支。 git branch -a 若没有对应的分…

47.Redis学习笔记

小林coding -> 图解redis的学习笔记 文章目录 Rediswindwos安装docker安装redis启动redis使用RDM访问虚拟机中的redispython连接redis缓存穿透、击穿、雪崩基本数据类型高级数据类型高并发指标布隆过滤器分布式锁Redis 的有序集合底层为什么要用跳表&#xff0c;而不用平衡…

谷歌推出10门免费AI课程,无需教科书及费用

谷歌面向小白以及开发者分别推出了不同的AI课程~ 包含初级、中级和高级。课程章节大致包括&#xff1a;&#xff08;含教学视频、参考材料、测验&#xff09; 基础入门&#xff1a;45分钟深入了解生成式AI 简单实操&#xff1a;30分钟掌握大语言模型 了解如何释放生成式 AI S…

基于小程序实现的投票评选系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

CSS选择器(基本+复合+伪类)

目录 CSS选择器 基本选择器 标签选择器&#xff1a;使用标签名作为选择器->选中同名标签设置样式 类选择器&#xff1a;给类选择器定义一个名字.类名&#xff0c;并给标签添加class"类名" id选择器&#xff1a;跟类选择器非常相似&#xff0c;给id选择器定义…
最新文章