数据结构实验1(顺序表逆置以及删除)

数据结构实验一 线性表(顺序表单链表逆置及单链表分解) 一、 实验目的 1. 熟悉线性表的顺序和链式存储结构 2. 掌握线性表的基本运算 3. 能够利用线性表的基本运算完成线性表应用的运算 二、 实验内容 1. 设有一个线性表E={e1, e2, … , en-1, en},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ en , en-1 , … , e2 , e1 },要求逆线性表占用原线性表空间, 阅读详情

在顺序表类SeqList中增加成员函数void Reverse(),实现顺序表的逆置。

在顺序表类SeqList中增加成员函数bool DeleteX(const T &x),删除表中所有元素值等于x的元素。若表中存在这样的元素,则删除

之,且函数返回true。否则函数返回false。


直接在SeqList类增加两个成员函数完成相应功能,逆置的话用到了stl中的栈,原elements入栈后紧着着赋值覆盖原来的元素值就实现

了逆置。删除所有等于x的元素则扫一遍顺序表,若找到等于x的元素就调用Delete()函数,最后比较原长度以及现长度就知道有没有删

除成功。


实现代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "stack"
using namespace std;
template <class T>
class LinearList
{
public:
	virtual bool IsEmpty() const = 0; // 为空则返回true
	virtual int Length() const = 0; // 返回长度
	virtual bool Find(int i, T &x) const = 0; // 若a[i]存在则x = a[i],返回true,不存在返回flase
	virtual int Search(T x) const = 0; // 若存在等于x的元素则返回下标,否则返回-1
	virtual bool Insert(int i, T x) = 0; // i == -1则x插在第一个元素之前, 否则x插在a[i]后,插入成功返回true
	virtual bool Delete(int i) = 0; // 删除元素a[i],删除成功返回true
	virtual bool Update(int i, T x) = 0; // 修改元素a[i]为x,若修改成功则返回true
	virtual void Output(ostream &out) const = 0;
	/* data */
protected:
	int n;
};
template <class T>
class SeqList:public LinearList<T>
{
public:
	SeqList(int mSize);
	~SeqList() {delete []elements;}
	bool IsEmpty() const;
	int Length() const;
	bool Find(int i, T &x) const;
	int Search(T x) const;
	bool Insert(int i, T x);
	bool Delete(int i);
	bool Update(int i, T x);
	void Output(ostream &out) const;
	void Reverse(); // 顺序表的逆置
	bool DeleteX(const T &x); // 删除表中所有等于x的元素,成功则返回true
	/* data */
private:
	int maxLength, n;
	T *elements;
};
template <class T>
SeqList<T>::SeqList(int mSize)
{
	maxLength = mSize;
	elements = new T[maxLength];
	n = 0;
}
template <class T>
bool SeqList<T>::IsEmpty() const
{
	return n == 0;
}
template <class T>
int SeqList<T>::Length() const
{
	return n;
}
template <class T>
bool SeqList<T>::Find(int i, T &x) const
{
	if(i < 0 || i > n - 1) { // i不合法
		cout << "Out of Bounds" << endl << endl;
		return false;
	}
	x = elements[i];
	return true;
}
template <class T>
int SeqList<T>::Search(T x) const
{
	for(int i = 0; i < n; ++i)
		if(elements[i] == x) return i;
	return -1;
}
template <class T>
bool SeqList<T>::Insert(int i, T x)
{
	if(i < -1 || i > n - 1) { // i不合法
		cout << "Out of Bounds" << endl << endl;
		return false;
	}
	if(n == maxLength) { // 数组满了
		cout << "OverFlow" << endl << endl;
		return false;
	}
	for(int j = n - 1; j > i; --j)
		elements[j + 1] = elements[j];
	elements[i + 1] = x;
	n++;
	return true;
}
template <class T>
bool SeqList<T>::Delete(int i)
{
	if(!n) { // 数组已经为空
		cout << "UnderFlow" << endl << endl;
		return false;
	}
	if(i < 0 || i > n - 1) { // i不合法
		cout << "Out of Bounds" << endl << endl;
		return false;
	}
	for(int j = i + 1; j < n; ++j)
		elements[j - 1] = elements[j];
	n--;
	return true;
}
template <class T>
bool SeqList<T>::Update(int i, T x)
{
	if(i < 0 || i > n - 1) { // i不合法
		cout << "Out of Bounds" << endl << endl;
		return false;
	}
	elements[i] = x;
	return true;
}
template <class T>
void SeqList<T>::Output(ostream &out) const
{
	for(int i = 0; i < n; ++i)
		out << elements[i] << " ";
	out << endl << endl;
}
template <class T>
void Union(SeqList<T> &A, SeqList<T> &B)
{
	T x;
	for(int i = 0; i < B.Length(); ++i) {
		B.Find(i, x);
		if(A.Search(x) == -1) A.Insert(A.Length() - 1, x);
	}
}
template <class T>
void SeqList<T>::Reverse()
{
	stack<T> s;
	for(int i = 0; i < n; ++i)
		s.push(elements[i]);
	for(int i = 0; i < n; ++i) {
		elements[i] = s.top();
		s.pop();
	}
	cout << "转置成功" << endl;
}
template <class T>
bool SeqList<T>::DeleteX(const T &x)
{
	int flag = n;
	for(int i = 0; i < n; ++i)
		if(elements[i] == x) {
            Delete(i);
            i--;
        }
	if(flag != n) return true;
	return false;
}
int main(int argc, char const *argv[])
{
	SeqList<int> A(20), B(20);
	for(int i = 0; i < 5; ++i)
		A.Insert(i - 1, i); // A = {0, 1, 2, 3, 4}
	cout << "顺序表A为:" << endl;
	A.Output(cout);

	for(int i = 5; i < 10; ++i)
		B.Insert(i - 6, i); // B = {5, 6, 7, 8, 9}
	cout << "顺序表B为:" << endl;
	B.Output(cout);

	A.Update(1, 5); // A = {0, 5, 2, 3, 4}
	cout << "更新后顺序表A为:" << endl;
	A.Output(cout);

	int flag = A.Search(2); // 元素中是否有2
	if(flag != -1) cout << "有等于2的元素" << endl;
	else cout << "无等于2的元素" << endl;

	int x;
	A.Find(2, x); // x = a[2];
	cout << "a[2] == " << x << endl;

	B.Insert(-1, 0); // B = {0, 5, 6, 7, 8, 9}
	cout << "插入0后顺序表B为:" << endl;
	B.Output(cout);

	B.Insert(3, 2); // B = {0, 5, 6, 7, 2, 8, 9}
	cout << "插入2后顺序表B为:" << endl;
	B.Output(cout);

	B.Delete(4); // B = {0, 5, 6, 7, 8, 9}
	cout << "删除4后顺序表B为:" << endl;
	B.Output(cout);

	Union(A, B); // 合并A, B到A  A = {0, 2, 3, 4, 5, 6, 7, 8, 9}
	cout << "合并A,B到A后顺序表A为:" << endl;
	A.Output(cout);

	B.Reverse(); // B = {9, 8, 7, 6, 5, 0};
	cout << "转置后顺序表B为:" << endl;
	B.Output(cout);

    B.Insert(-1, 9);
    cout << "插入9后顺序表B为:" << endl;
	B.Output(cout);

    x = 9;
	if(B.DeleteX(x)) cout << "删除表中x成功" << endl;
	else cout << "表中无等于x的元素" << endl;
	cout << "顺序表B为:" << endl;
	B.Output(cout);
	return 0;
}




《数据结构》实验一报告(单链表的就地反转) 实验内容:(一)单链表的就地反转 一、目的和要求(需求分析): 1、掌握数据的链式存储结构以及链表的建立和操作。 2、利用链表的原空间进行链表的反转; (设计一个将输入数据建立成链表、并依次输出链表数据、利用原空间把链表反转的程序。) 二、程序设计的基本思想,原理和算法描述: 1.新建单链表 2.依次输出单链表的结点值 3.就地反转 4.打印反转后的链表L 5.摧毁单链表 逆置操作使p,q两个指针... 阅读详情

相关推荐

Sdut PTA 21级数据结构与算法实验1——顺序表(C语言版)

读入n值及n个整数,建立顺序表并遍历输出。

sky_kin的博客 6690

从顺序表L中删除所有元素值介于x和y之间的所有元素

从顺序表L中删除所有元素值介于x和y之间的所有元素。对于顺序表来讲,数据是被存储在一段连续的内存中的,所以删除元素时不能像链表那样直接将要删除的元素跳过,然后将要删除元素所在空间释放,那我们要怎么做才能达到将元素删除的效果呢? 我们一步一步来思考,首先要明确我们的目标,就是将某些符合要求的元素删除。好的,现在在我们内存中有一排空间,首先找到要删除的元素,找到之后我们把它“擦除”,现在被“擦除”的空间是没有放置任何数据的,为了保证顺序表存储的连续性,我们要将后面的元素向前移动,这样就又符合顺序表的存储结构了

qq_69426354的博客 1930

删除顺序表中值相同的多余元素

设计并验证一下算法:设顺序表L中的数据元素为整数且非递增有序,删除其值相同的多余元素,即顺序表L中相同的元素只保留一个,并逆置删除后的顺序表L。(1)根据键盘输入数据建立顺序表L。(2)输出顺序表L、删除值相同的多余元素后的顺序表L、逆置的顺序表L。(3)假设顺序表L长度为n,要求以O(n)的时间复杂度完成对值相同多余元素的删除。实验代码#include &lt;stdio.h&gt; #incl...

木木夕的博客 1万+

南邮数据结构实验1 顺序表操作

实验内容和提示: 1.在顺序表类SeqList中增加成员函数void Reverse(),实现顺序表的逆置。 2.在顺序表类SeqList中增加成员函数bool DeleteX(const T &x),删除表中所有元素值等于x的元素。若表中存在这样的元素,则删除之,且函数返回true;否则函数返回false。 3.编写main函数,调用上述新增函数。 4.提示:创建LinearLi

Tc的专栏 6355

scau 数据结构实验一 8578 顺序表逆置

Description 顺序表的基本操作代码如下: #include<stdio.h> #include<malloc.h> #define OK 1 #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define ElemType int typedef int Status; typedef struct { int *elem; int length; int

qq_61974198的博客 631

保姆级教程:从Navicat 11/12到15,平滑升级搞定MySQL 8.0的caching_sha2_password认证

本文提供从Navicat 11/12升级到15的保姆级教程,重点解决MySQL 8.0的caching_sha2_password认证问题。详细介绍了备份配置、新版本功能亮点、跨平台安装步骤、配置迁移流程以及高级使用技巧,帮助用户平滑过渡到Navicat 15,提升数据库管理效率。

weixin_33724046的博客 203

线性表逆置实验报告

课程设计题目:线性表逆置实验 一、问题描述 试分别以顺序表和单链表作存储结构,各写一实现线性表就地逆置的算法。 二、基本要求 逆置线性表。 就地(空间复杂度至多O(1)O(1)O(1))。 三、概要设计 1. 数据结构的设计 依题目要求,本实验采用顺序表和单链表。 2. 算法的设计 对于顺序表的逆置,我们使用两个指针i和j,分别从左到右和从右到左扫描,交换元素,直到相遇。 伪代码如下 void reverse() { for (int i = 0, j = length - 1, t; i &l

Shudderwock 的博客 1712

基于云盾构建等保三级Web安全体系:从合规要求到实战落地

网络安全等级保护(等保)是保障信息系统安全的重要制度,其核心原理是通过分级防护、动态调整的策略,构建纵深防御体系。在技术层面,等保要求覆盖物理环境、通信网络、区域边界、计算环境和安全管理中心等多个层面,旨在通过技术和管理相结合的方式,有效应对网络攻击和数据泄露风险。对于Web应用而言,满足等保三级要求具有极高的技术价值,它不仅是合规的刚性需求,更是提升业务系统整体安全水位、建立用户信任、保障业务连续性的关键工程实践。在云计算时代,利用云原生安全服务(如Web应用防火墙WAF、云安全中心、态势感知等)可以高效

weixin_29324877的博客 306

Java顺序表的就地逆置算法

Java顺序表的就地逆置算法 假设已经定义有顺序表类SequenceList,该类中定义了表的相关操作方法,试编写程序实现顺序表的就地逆置算法,即在原表的存储空间将顺序表(a1,a2,a3,…,an)逆置为(an,an-1,…,a1)。 import java.util.ArrayList; import java.util.List; public class SequenceList&l...

5893

TPC好像是这么回事儿

TPC(Transmit Power Control)发送功率控制,本觉得就是控制一下发送功率,原理很简单,但看原版协议死活每搞懂什么意思,恼羞成怒!!!! 后来又看了一些贴子和cisco的相关功能介绍,再回头看协议,好像是这么一回事: 1、所谓TPC,是AP控制STA的发送功率的一种手段。在802.11d中,已定义了使用Country Element传递区域无线通信规定的信道和最大发送功率信息: 通过获取这些信息,STA可以确定自己应该遵守什么规则,可以用什么发送功率在哪些信道上通信。 2

两只勤劳的蜜蜂 8625

第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案

本文主要介绍了第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案,希望能对使用OpenClaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

顺序表的编程题及完整代码(顺序表逆置、删除、合并、查找等)

文章目录顺序表逆置将循序表L中的所有元素逆置将两个顺序表的位置互换删除操作删除顺序表L中所有值为x的数据元素删除有序顺序表L中所有值重复的元素合并操作将两个有序顺序表合并成一个新的有序顺序表查找操作找两个等长升序序列的中位数说明 顺序表逆置 将循序表L中的所有元素逆置 问题描述: 将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。 算法思想: 扫描顺序表L的前半部分元素,对于元素L.data[i](0<=i<L.length/2),将其与后半部分对应元素L.data[L.length-1

薛定谔的猫的博客 4698

MFC Windows 程序设计[122]之树形下拉列表框(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。.........

hnjzfwy的博客 458

数据结构(一)顺序表2:顺序表的就地逆置和顺序表中删除元素值

问题一:  实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1,a2,…,an),逆置为(an,an-1,…,a1)。 1.顺序表的全部逆置 设一个临时变量,将顺序表逆置 //顺序表的全部逆置 void reverse_list(Sqlist &L) { //就地逆置,设一个临时变量,将顺序表逆置 int i=0,j,k; for(j=L.length

___cc木槿 4032

Python爬虫实战教程:如何高效爬取税务局通知通告

税务局发布的通知通告包含政策法规、办税指南、公告信息等,是纳税人、企业合规经营的重要参考。官网发布频率高,手动查看不便,自动爬取并保存,方便信息及时掌握及历史数据归档。本文以合法合规的方式示范,建议实际应用前确认目标网站允许爬取的范围和方式。建议使用pandas进行数据清洗,如去重、空值处理等。对于研究税务政策、进行大数据分析、搭建行业信息平台,爬取税务局通知通告信息尤为关键。公告列表以分页形式展现,包含标题、发布时间和详情页链接。进行政策趋势图、发布频率统计等可视化。爬取公开数据时,务必遵守网站的。

2201_76125261的博客 1781

matlab之作图设置游标的精度

matlab画出的figure游标的精度往往是固定的,这就对我们的调试和查看数据造成了不便。 那么怎么修改游标的精度呢? 首先,获取游标dcm_obj = datacursormode(gcf);然后对游标的精度进行设置:set(dcm_obj,'UpdateFcn',@NewCallback)这个NewCallback是什么东西呢?这是一个可以返回游标精度的函数,具体内容如下:function

落日之城 8957

8578 顺序表逆置

SCAU数据结构OJ习题第一章8578 顺序表逆置

callmeggyh的博客 973

DeepSeek+即梦:AI视频创作从0到1全突破

本文为 DeepSeek 与即梦生成视频全攻略,从前期注册登录、熟悉工具界面及硬件网络准备入手,助读者开启 AI 视频创作。详细阐述利用 DeepSeek 构思脚本、即梦实现画面生成与静态图转动态视频的方法,包括提示词编写、参数调整等技巧。同时介绍后期合成音画、添加字幕特效及多平台适配要点,结合实战案例解析全流程。还分享进阶提示词优化、版权注意等避坑指南,为创作者提供从 0 到 1 的 AI 视频创作完整解决方案。

邓邓子的博客 8102

数据结构 实验一 顺序表的操作

一、顺序表的操作 任务:初始化一个顺序表并输出。 相关知识: 需要掌握: 1.结构体变量初始化 2.如何遍历顺序表。 结构体变量初始化: 定义结构体变量的同时,给结构体变量的各个成员变量赋值。 示例如下: sequenlist sq={{1,3,6,7},3}; {1,3,6,7}是给结构体中的数组赋值, 3.给成员变量 last 赋值 遍历顺序表: 给定一个顺序表L,从0~L->last,依次输出,就可以遍历完顺序表中的所有元素。 其中L是指向顺序表的指针。 示例如下: void listprint

TXYGoodluck的博客 8557

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【数据结构】顺序表

顺序表示一种最为简单的线性结构,可以分为两种,一种是静态顺序表,一种是动态顺序表 1)静态顺序表 所谓静态顺序表是指一旦定义了该表,其大小始终固定不变,函数调用时,静态顺序表在函数栈上开辟空间,我们熟悉的数组就是一种静态顺序表 e.g #definde MAXSIZE 100 ElemType Sqlist[MAXSIZE]; int len; 2)动态顺序表 所谓动态顺序表...

无意呢的博客 5877

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

顺序表逆置,链表逆置

顺序表逆置真题: 1.将一长度为n的数组的前端k(k<n)}个元素逆置后移动到数组后端,要求原数组中数据不丢失; 2.将一长度为n的数组的前端k(k<n)个元素保持原序移动到数组后端,要求原数组中数据不丢失; 3.将数组中的元素(Xo, X1, ... Xn-1),经过移动后变为:(Xp, Xp+1, ...Xn-1, Xo, X1, ..Xp-1) ,即循环左移p(0<p...

知且行的博客 1935

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构--线性表的销毁,逆置

c语言进行多次输入时可采用EOF来实现 while(scanf("%c%c%c",&ah,&ch,&bh)!=EOF)//进行多次输入用EOF

fly 7999

【数据结构】单链表就地逆置算法C语言

单链表就地逆置算法程序样例 在C语言中为了减少时间和空间,对单链表采用就地逆置的方法,话不多说,完整代码如下。 #include<stdio.h> #include<malloc.h> #define LEN sizeof (struct Node) struct Node { int data;//定义数据域 struct Node *next;//定义指针域 int length;//记录顺序表的长度 }; //建立动态链表 struct Node *crt_list(

九芒星的博客 9776

数据结构第二章线性表(一)①顺序表插入并递增有序(已知顺序表L中的元素递增有序排列,设计算法将元素x插入到表L中并保持表L仍递增有序)②删除顺序表元素③顺序表逆置

文章目录1、顺序表插入并递增有序已知顺序表L中的元素递增有序排列,设计算法将元素x插入到表L中并保持表L仍递增有序。2、删除顺序表元素在顺序表中删除所有元素值为x的元素,要求空间复杂度为O(1)。3、顺序表逆置以顺序表存储非空线性表,编写一个实现线性表就地逆置的算法。空间复杂度均是O(1)。 1、顺序表插入并递增有序 已知顺序表L中的元素递增有序排列,设计算法将元素x插入到表L中并保持表L仍递增有序。 /*顺序表插入并递增有序 已知顺序表L中的元素递增有序排列,设计算法将 元素x插入到表L中并保持表L仍递增

Happy_change的博客 1万+

SCAU 8578 顺序表逆置

8578 顺序表逆置 时间限制:1000MS 代码长度限制:10KB 提交次数:3660 通过次数:2149 题型: 编程题 语言: G++;GCC Description 顺序表的基本操作代码如下: #include<stdio.h> #include<malloc.h> #define OK 1 #define ERROR 0 #define LIST_INIT_...

Maoxim的博客 1087
上一篇: HDOJ2087 剪花布条(kmp)
下一篇: 数据结构实验1(一元多项式的相加和相乘)
GKHack
博客等级 码龄11年 48粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值