1. 程式人生 > >資料結構實驗1:C++實現靜態順序表類

資料結構實驗1:C++實現靜態順序表類

       寫了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 = 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;
}
圖17 程式執行演示截圖2