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

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

  int MaxSize=100;

template <class DataType>

class SeqList {

public:

    SeqList(){length=0;}//無參建構函式 空的順序表

    SeqList(DataType a[],int n);//有參建構函式,建立一個長度為n的順序表

    ~SeqList(){}//解構函式為空

    int Length(){return length;}//求線性表的長度

    DataType Get(

int i);//按位查詢,線上性表中查詢第i個元素

    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就會報錯