C++資料結構實驗報告:順序表實現
一,順序表的作用
線性結構的基本特徵為:
1.集合中必存在唯一的一個“第一元素”
2.集合中必存在唯一的一個 “最後元素”
3.除最後一個元素之外,均有 唯一的後繼(後件)
4.除第一個元素之外,均有 唯一的前驅(前件) 由n(n≥0)個數據元素(結點)a1,a2,…,an組成的有限序列。資料元素的個數n定義為表的長度。當n=0時稱為空表。常常將非空的線性表(n>0)記作:(a1,a2,…an) 資料元素ai(1≤i≤n)只是一個抽象的符號,其具體含義在不同的情況下可以不同。
線性表的基本操作
1)Setnull(L) 置空表
2)Length(L) 求表長度;求表中元素個數
3)Get(L,i) 取表中第i個元素(1≤i≤n)
4)Prior(L,i) 取i的前趨元素
5)Next(L,i) 取i的後繼元素
6)Locate(L,x) 返回指定元素在表中的位置
7)Insert(L,i,x)插入元素
8)Delete(L,x) 刪除元素
9)Empty(L) 判別表是否為空
-----------------------------------------------------
二,順序表程式碼
//
// main.cpp
// 線性表的順序儲存結構
//
// Created by 樑華建 on 2017/9/14.
// Copyright © 2017年 樑華建. All rights reserved.
//
#include <iostream>
//定義常量MaxSize 不一定要100,代表的是陣列的儲存數量
const
template <class DataType>
class SeqList {
public:
SeqList(){length=0;}//無參建構函式 空的順序表
SeqList(DataType a[],int n);//有參建構函式,建立一個長度為n的順序表
~SeqList(){}//解構函式為空
int Length(){return length;}//求線性表的長度
DataType Get(
int Locate(DataType x);//按值查詢,線上性表中查詢值位x的元素序號
void Insert(int i,DataType x);//插入操作,線上性表中第i個位置插入值為x的元素
DataType Delete(int i);//刪除操作,刪除線性表的第i個元素
void PrintList();//遍歷操作,按序號依次輸出各元素
private:
DataType data[MaxSize];//存放資料元素的陣列
int length;
};
//有參建構函式實現
template <class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
if (n>MaxSize)throw "引數非法";
for (int i=0; i<n; i++)
data[i]=a[i];
length=n;
}
//getter函式的實現 獲得i的位置
template <class DataType>
DataType SeqList<DataType>::Get(int i)
{
if (i<1&&i>length)
throw "查詢位置非法";
return data[i-1];
}
//查詢函式 找到資料的下標位置
template<class DataType>
int SeqList<DataType>::Locate(DataType x)
{
for (int i=0; i<length; i++)
if (data[i]==x)return i+1;//找到之後返回下標
return 0;//退出迴圈說明查詢失敗
}
//插入函式 插入一個數據元素到列表中
template <class DataType>
void SeqList<DataType>::Insert(int i, DataType x)
{
if (length>=MaxSize) throw "上溢位";
if (i<1||i>length+1) throw "插入位置錯誤";
for (int j=length; j>=i; j--)//插入後後面的物件後移一個單位
data[j]=data[j-1];
data[i-1]=x;
length++;//列表加一
}
//刪除函式 刪除一個數據元素從列表中
template <class DataType>
DataType SeqList<DataType>::Delete(int i)
{
if (length<=0) throw "下溢位";
if (i<1||i>length+1) throw "刪除位置錯誤";
DataType x=data[i-1];//需要刪除的元素
for (int j=i; j<=i; j--)
data[j-1]=data[j];
length--;
return x;
}
//遍歷函式 按下標依次輸入各元素
template <class DataType>
void SeqList<DataType>::PrintList()
{
for (int i=0; i<length; i++) {
std::cout<<"第個數"<<i<<"值為"<<data[i]<<" ";
}
}
-----------------------------------------------------
三,出現的問題和程式碼缺點
問題:完成該程式碼的時候要有較清晰的for使用思路,不然很容易混淆,刪除和插入函式的思路差不多,還有每次要想好資料輸入可能出現的問題,當輸入資料上溢或者下溢的時候應該throw出錯誤而不是程式碼崩掉.保證演算法的魯棒性。
缺點:
1,每次插入或者刪除都要移動大量資料
2,表的容量難以確定
3,造成儲存空間的碎片,陣列要去連續的儲存空間 如果不連續則不能使用
-------------------------------------------------------
四,編寫main函式測試
main函式中呼叫student測試函式
當陣列的數大於定義的maxsize就會報錯