写了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. vue文件中style标签的几个标识符

    .vue文件中style标签的几个标识符 在人生就要绝望的时候, 被编辑器所提示的一个scopedSlots所拯救. 卧槽, 写到最后才发现这个属性的具体卵用. 详情见最后解决办法. 问题背景 问题由 ...

  2. jsp问题记录

    2014-10-10 20:53:16 Jsp的el表达式:‘${value}’  用于获取后台传过来的值 而<%=value %>则是获取当前页面java代码的值

  3. 关于list,字符串的小记录

    1.关于操作list的命令: a.append("hi") 这个可以在list的最后一项加上个这个字符串"hi",a是list的名字. del a[3] 删去l ...

  4. map,reduce高阶函数

    iterator:迭代器 python的iterator是一个惰性序列(即你不主动去遍历它,他不会去计算其中元素的值) m是一个iterator,所以通过tuple()函数让整个序列计算出来,并返回一 ...

  5. VS2013编译libjpeg库

    第一步:找到刚刚解压出来的“jpeg-9a”文件夹下面的“makefile.vc”文件,用记事本或Notepad++等编辑工具打开,然后找到里面的“!include <win32.mak> ...

  6. 【学习笔记】深入理解js原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  7. XML验证

    合法的XML和形式良好的XML ? 拥有正确语法的 XML 被称为"形式良好"的 XML. 第一行是 XML 声明.它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8 ...

  8. http://blog.chinaunix.net/uid-9845710-id-1996675.html snmpd配置

    http://blog.chinaunix.net/uid-9845710-id-1996675.html http://lihuipeng.blog.51cto.com/3064864/643960 ...

  9. 错误消息 This computer doesn't have VT-X/AMD-v enabled

    在VirtualBox的Ubuntu虚拟机里试图本地安装Kyma(一个基于Kubernetes的开源框架)时,遇到下面的错误信息: E0827 11:19:38.972489 3093 start.g ...

  10. Android安卓下拉阻尼效果实现原理及简单实例

    原理  这种效果是通过自定义控件的方式来实现的,我自定义了一个控件类型,这个自定义控件(PullDownDumperLayout)继承自线性布局(LinearLayout).  用户可以下拉弹出的那个 ...