資料結構實驗1:C++實現靜態順序表類
寫了3個多小時,還是太慢了、太菜了!
實驗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 執行結果截圖
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 = 10000+13;
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檔案:
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 = 0; i < n; i ++ )
{
int num;
cin >> num;
L1.insertList_1(num);
}
cout << "當前表長為:" << L1.Length() << endl;
L1.printList();
L1.insertList( 5, -1 );
cout << "當前表長為:" << L1.Length() << endl;
L1.printList();
int data;
L1.deleteListNode( 4, data );
cout << "值為 " << data << " 的元素已刪除!" << endl;
L1.deleteListNode_1(6);
cout << L1.Length() << endl;
L1.printList();
L1.deleteListNode_1(7);
cout << "當前表長為:" << L1.Length() << endl;
L1.printList();
int delKey = 2;
L1.deleteListNode_2(delKey);
cout << "所有值為" << delKey << "元素刪除後," << "當前表長為:" << L1.Length() << endl;
L1.printList();
SeqList L2;
if( L2.isEmpty() )
{
cout << "空表!" << endl;
}
for( int j = 0; j < maxn; j ++ )
{
L2.insertList_1( j + 1 );
}
if( L2.isFull() )
{
cout << "表滿!" << endl;
}
cout << "當前表長為:" << L2.Length() << endl;
L2.printList();//改為 L1.printList(); 會有意想不到的效果!
return 0;
}