写了3个多小时,还是太慢了、太菜了!

图1 程序运行演示截图1

实验1

1.1 实验目的

熟练掌握线性表的顺序存储结构。

熟练掌握顺序表的有关算法设计。

根据具体问题的需要,设计出合理的表示数据的顺序结构,并设计相关算法。

1.2 实验要求

顺序表结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现;

比如存储、算法实现放入文件:seqList.h

实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;

程序有适当的注释。

1.3 实验任务

编写算法实现下列问题的求解。

<1>求顺序表中第i个元素(函数),若不存在,报错。

实验测试数据基本要求:

第一组数据:顺序表长度n≥10,i分别为5,n,0,n+1,n+2

第二组数据:顺序表长度n=0,i分别为0,2

<2>在第i个结点前插入值为x的结点。

实验测试数据基本要求:

第一组数据:顺序表长度n≥10,x=100,  i分别为5,n,n+1,0,1,n+2

第二组数据:顺序表长度n=0,x=100,i=5

<3>删除顺序表中第i个元素结点。

实验测试数据基本要求:

第一组数据:顺序表长度n≥10,i分别为5,n,1,n+1,0

第二组数据:顺序表长度n=0, i=5

<4>在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。

实验测试数据基本要求:

顺序表元素为(10,20,30,40,50,60,70,80,90,100),

x分别为25,85,110和8

<5>将顺序表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的顺序表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果。

实验测试数据基本要求:

第一组数据:顺序表元素为(1,2,3,4,5,6,7,8,9,10,20,30,40,50,60)

第二组数据:顺序表元素为(10,20,30,40,50,60,70,80,90,100)

<6>求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中。

实验测试数据基本要求:

第一组

第一个顺序表元素为(1,3,6,10,15,16,17,18,19,20)

第二个顺序表元素为(1,2,3,4,5,6,7,8,9,10,18,20,30)

第二组

第一个顺序表元素为(1,3,6,10,15,16,17,18,19,20)

第二个顺序表元素为(2,4,5,7,8,9,12,22)

第三组

第一个顺序表元素为()

第二个顺序表元素为(1,2,3,4,5,6,7,8,9,10)

<7>删除递增有序顺序表中的重复元素,并统计移动元素次数,要求时间性能最好。

实验测试数据基本要求:

第一组数据:顺序表元素为(1,2,3,4,5,6,7,8,9)

第二组数据:顺序表元素为(1,1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,9)

第三组数据:顺序表元素为(1,2,3,4,5,5,6,7,8,8,9,9,9,9,9)

1.4* 顺序表扩展实验

非必做内容,有兴趣的同学选做,

<1>递增有序顺序表L1、L2,对2表进行合并,并使得合并后成为一个集合,集合的元素放回L1表中保存,要求时间性能最好。

<2>(递增有序)顺序表表示集合A、B,实现:

C=A∩B,C=A∪B,C=A-B

A=A∩B,A=A∪B,A=A-B

<3>(递增有序)顺序表表示集合A、B,判定A是否B的子集。

<4>(2011)(15 分)一个长度为L(L≥1)的升序序列S,处在第L/2个位置的数称为S 的中位数。例如,若序列S1=(11, 13, 15, 17, 19),则S1 的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2, 4, 6, 8, 20),则S1 和S2 的中位数是11。

现有两个等长升序序列A 和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A 和B 的中位数。要求:

(1)给出算法的基本设计思想。

(2)根据设计思想,采用C 或C++语言描述算法,关键之处给出注释。

(3)说明你所设计算法的时间复杂度和空间复杂度。

1.5 运行结果截图

图2 测试(1)①

图3 测试(1)②

图4 测试(2)①

图5 测试(2)②

图6 测试(3)①

图7 测试(3)②

图8 测试(4)

图9 测试(5)①

图10 测试(5)②

图11 测试(6)①

图12 测试(6)②

图13 测试(6)③

图14 测试(7)①

图15 测试(7)②

图16 测试(7)③

StdAfx.h文件:

 // stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
// #if !defined(AFX_STDAFX_H__D36E9D40_3BCB_4A85_9D48_AC876E7A2942__INCLUDED_)
#define AFX_STDAFX_H__D36E9D40_3BCB_4A85_9D48_AC876E7A2942__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 #include <stdc++.h>//万能头文件,非常好用!我用的是VC6.0,里面没有;
//因此手动将codeblocks的 stdc++.h 文件导入到 D:\software\Microsoft Visual Studio\VC98\Include 中 typedef int elementType;
const int maxn = +;
using namespace std; // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__D36E9D40_3BCB_4A85_9D48_AC876E7A2942__INCLUDED_Code
 // stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
// #if !defined(AFX_STDAFX_H__D36E9D40_3BCB_4A85_9D48_AC876E7A2942__INCLUDED_)
#define AFX_STDAFX_H__D36E9D40_3BCB_4A85_9D48_AC876E7A2942__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 #include <stdc++.h>//万能头文件,非常好用!我用的是VC6.0,里面没有;
//因此手动将codeblocks的 stdc++.h 文件导入到 D:\software\Microsoft Visual Studio\VC98\Include 中 typedef int elementType;
const int maxn = +;
using namespace std; // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__D36E9D40_3BCB_4A85_9D48_AC876E7A2942__INCLUDED_)

SeqList1.h文件:

// SeqList1.h: interface for the SeqList class.
//
////////////////////////////////////////////////////////////////////// #if !defined(AFX_SEQLIST1_H__5F69CE41_7D8B_4396_BAAE_F849B1FD54D1__INCLUDED_)
#define AFX_SEQLIST1_H__5F69CE41_7D8B_4396_BAAE_F849B1FD54D1__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 class SeqList
{
public:
SeqList();
virtual ~SeqList();
void printList();
int Length();
int locate( elementType value );//返回第一个值对value的位置,没有则返回-1
bool isEmpty();//判空
bool isFull();//判满
bool getElement( int pos, elementType& value );//获取pos位置的值
bool insertList( int pos, elementType value );//在pos位置前插入value值
bool insertList_1( elementType value );//在尾部插入value值
bool deleteListNode( int pos, elementType& value );//按位置删除元素
bool deleteListNode_1( int value );//按值删除元素
bool deleteListNode_2( int value );//按值删除所有对应元素
private:
elementType Arr[maxn];//存放表元素的数组
size_t listSize;//记录当前顺序表的大小
}; #endif // !defined(AFX_SEQLIST1_H__5F69CE41_7D8B_4396_BAAE_F849B1FD54D1__INCLUDED_)

SeqList1.cpp文件:

 // SeqList1.cpp: implementation of the SeqList class.
//
////////////////////////////////////////////////////////////////////// #include "stdafx.h"
#include "SeqList1.h" //////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////// SeqList::SeqList()
{
listSize = ;
} SeqList::~SeqList()
{
cout << this << " 顺序表已销毁!" << endl;
} void SeqList::printList()
{
int column = ;
for( int i = ; i < listSize; i ++ )
{
cout<< setiosflags(ios::left) << setw() << Arr[i] << " ";
if( ++ column % == )
cout << endl;
}
cout << endl;
} int SeqList::Length()
{
return listSize;
} int SeqList::locate( elementType value )
{
for( int i = ; i < listSize; i ++ )
if( Arr[i] == value )
return i + ;
return -;
} bool SeqList::isEmpty()
{
return listSize == ;
} bool SeqList::isFull()
{
return listSize == maxn;
} bool SeqList::insertList( int pos, elementType value )
{
if( isFull() )
{
cout << "顺序表已满!插入失败!" << endl;
return false;
}
if( pos > listSize )
{
cout << "插入位置超过当前顺序表容量!插入失败!" << endl;
return false;
}
if( pos <= )
{
cout << "插入位置必须大于0!插入失败!" << endl;
return false;
}
for( int i = listSize - ; i >= pos - ; i -- )
Arr[ i + ] = Arr[i];
Arr[ pos - ] = value;
listSize ++;//一定不能少!
return true;//一定不能少!
} bool SeqList::insertList_1( elementType value )
{
if( isFull() )
{
cout << "顺序表已满!插入失败!" << endl;
return false;
}
Arr[ listSize ++ ] = value;
return true;//一定不能少!
} bool SeqList::deleteListNode( int pos, elementType& value )
{
if( isEmpty() )
{
cout << "顺序表为空!删除失败!" << endl;
return false;
}
if( pos > listSize )
{
cout << "删除位置大于表长!删除失败!" << endl;
return false;
}
value = Arr[ pos - ];
for( int i = pos; i < listSize - ; i ++ )
Arr[ i - ] = Arr[i];
listSize --;//一定不能少!
return true;//一定不能少!
} bool SeqList::deleteListNode_1( int value )
{
if( isEmpty() )
{
cout << "顺序表为空!删除失败!" << endl;
return false;
}
if( locate(value) == - )
{
cout << "表中无此元素!删除失败!" << endl;
return false;
}
int index = locate(value);
for( int i = index - ; i < listSize; i ++ )
Arr[i] = Arr[ i + ];
listSize --;//一定不能少!否则会出现已失效的位置仍占有先前元素的错误!
return true;//一定不能少!
/*精简版如下!
void delete(int A[],int key,int& n)
{
int i,j;
for(i=0;i<n&&A[i]-key;i++); //查找key值元素
if(i>=n)
cout<<"not found"<<endl;
else
{
for(j=i;j<n-1;A[j]=A[j+1],j++);//若找到,将该元素后边的值向前覆盖
--n;//数组长度减1
}
}
---------------------
作者:castle_kao
来源:CSDN
原文:https://blog.csdn.net/castle_kao/article/details/53487610?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
*/
} bool SeqList::deleteListNode_2( int value )
{
if( isEmpty() )
{
cout << "顺序表为空!删除失败!" << endl;
return false;
}
if( locate(value) == - )
{
cout << "表中无此元素!删除失败!" << endl;
return false;
}
int cnt = ;
for( int i = ; i < listSize; i ++ )
if( Arr[i] == value )
cnt ++;
while( cnt -- )
{
int pos = locate(value), data;
deleteListNode( pos, data );
}
return true;
}

SeqList.cpp(测试函数)文件:

 // SeqList.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include "SeqList1.h" int main(int argc, char* argv[])
{
ios::sync_with_stdio(false);
freopen( "x1.in", "r", stdin );
//freopen( "x1.out", "w", stdout );
//printf( "%d\n", (bool)-1 );
SeqList L1;
if( L1.isEmpty() )
{
cout << "空表!" << endl;
}
int n;
cin >> n;
for( int i = ; i < n; i ++ )
{
int num;
cin >> num;
L1.insertList_1(num);
}
cout << "当前表长为:" << L1.Length() << endl;
L1.printList();
L1.insertList( , - );
cout << "当前表长为:" << L1.Length() << endl;
L1.printList();
int data;
L1.deleteListNode( , data );
cout << "值为 " << data << " 的元素已删除!" << endl; L1.deleteListNode_1();
cout << L1.Length() << endl;
L1.printList(); L1.deleteListNode_1();
cout << "当前表长为:" << L1.Length() << endl;
L1.printList(); int delKey = ;
L1.deleteListNode_2(delKey);
cout << "所有值为" << delKey << "元素删除后," << "当前表长为:" << L1.Length() << endl;
L1.printList(); SeqList L2;
if( L2.isEmpty() )
{
cout << "空表!" << endl;
}
for( int j = ; j < maxn; j ++ )
{
L2.insertList_1( j + );
}
if( L2.isFull() )
{
cout << "表满!" << endl;
}
cout << "当前表长为:" << L2.Length() << endl;
L2.printList();//改为 L1.printList(); 会有意想不到的效果! return ;
}

图17 程序运行演示截图2

数据结构实验1:C++实现静态顺序表类的更多相关文章

  1. 数据结构实验3:C++实现顺序栈类与链栈类

      实验3 3.1 实验目的 熟练掌握栈的顺序存储结构和链式存储结构. 熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现. 根据具体给定的需求,合理设计并实现相关结构和算法.3.2实验要求3.2.1 ...

  2. SDUT OJ 数据结构实验之链表一:顺序建立链表

    数据结构实验之链表一:顺序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  3. SDUT-3378_数据结构实验之查找六:顺序查找

    数据结构实验之查找六:顺序查找 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个给定的无序序列里,查找与给定关键字 ...

  4. SDUT-2116_数据结构实验之链表一:顺序建立链表

    数据结构实验之链表一:顺序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个整数,按照输入的顺序建立单链 ...

  5. 线性表的顺序存储结构之顺序表类的实现_Java

    在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放 ...

  6. 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表

    在学习之前,先说下我的软件情况,操作系统是manjaro linux 今天刚刚升级的,编辑器是vim8.0.55,编译器是gcc 6.2.1,调试器是gdb 7.12,版本再低点也可以,只要gcc版本 ...

  7. [数据结构]C#基于数组实现泛型顺序表

    前方预警,只完成了顺序表的插入/删除/查找. 错误代码示例: /// <summary> /// 查找顺序表第i个位置的元素 /// 在显示情况中,我们更常用下标 /// </sum ...

  8. 数据结构C语言版--静态顺序表的基本功能实现(一)

    /* * 功能:创建一个线性表,并输出 * 静态分配内存 */ #include<stdio.h> //stdio.h是C的标准I/O库 //#include<iostream> ...

  9. [PTA] 数据结构与算法题目集 6-2 顺序表操作集

    //创建并返回一个空的线性表: List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode)); L->Last = -1; ...

随机推荐

  1. Spring 2.5

    Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring ...

  2. (转) ACM必备(学完一个就加亮一个)不多,就这些!

    时间复杂度(渐近时间复杂度的严格定义,NP问题,时间复杂度的分析方法,主定理)排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排  序,外部排序)数论(整 ...

  3. magento package

    Magento Local module file is relative to app/code/local/ Magento Community module file is relative t ...

  4. imagettftext

    ImageTTFText 写 TTF 文字到图中. 语法: array ImageTTFText(int im, int size, int angle, int x, int y, int col, ...

  5. yum卸载遇到的问题--待解决

    系统版本是 [root@master ~]# uname -a Linux master -.el6.x86_64 # SMP Sun Nov :: EST x86_64 x86_64 x86_64 ...

  6. java实现课堂随机点名小程序

    通过jdbc连接数据库实现读取学生花名册进行随机点名! ~jdbc连接mysql数据库  ||  注释部分代码可通过读取.txt文档实现显示学生信息 ~通过点击开始按钮实现界面中间标签不断更新学生信息 ...

  7. 人物丨让小三吐血,让原配泣血——24K渣男郎咸平

    http://url.cn/5swgmythttps://www.toutiao.com/i6650650793743483395人物丨让小三吐血,让原配泣血——24K渣男郎咸平 人物丨让小三吐血,让 ...

  8. 谈谈对Android中的消息机制的理解

    Android中的消息机制主要由Handler.MessageQueue.Looper三个类组成,他们的主要作用是 Handler负责发送.处理Message MessageQueue负责维护Mess ...

  9. 浏览器报错问题解决:Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight respons

    FAQ: Failed to load http://www.erpshop.com/index.php: Request header field Content-Type is not allow ...

  10. mysql 中modify和change区别(以及使用modify修改字段名称报错)

    使用modify修改字段报错如下: mysql> alter table student modify name sname char(16);ERROR 1064 (42000): You h ...