顺序表的基本操作实现及其应用(实验1)

顺序表是用一段地址连续的存储单元依次存储线性表的数据元素。由于线性表中每个数据元素的类型相同,通常用一维数组来实现顺序表。 下面我么就用C++来做一个小demo,实现顺序表的基本功能。

由于线性表的数据元素类型不确定,所以采用C++的模板机制,下面是顺序表模板的代码

// SequenList.h

#ifndef SequenList_h
#define SequenList_h
#include <iostream>
using namespace std;
const int MaxSize = 50;
template <class T>
class SeqList
{
private:
    T data[MaxSize];
    int length;
public:
    SeqList() {length = 0;}
    SeqList(T a[], int n);
    ~SeqList() {}
    int Length() {return length;}
    T Get(int i);
    int Locate(T x);
    void Insert(int i, T x);
    T Delete(int i);
    void clearList();
    void PrintList();
};
#endif /* SequenList_h */

// SequenList.cpp

#include "SequenList.h"

/**
 * 先判断是否合法 否则抛出异常
 */
template <class T>
SeqList<T> :: SeqList(T a[], int n)
{
    if (n > MaxSize) throw "error : 超出数组最大范围";
    for (int i = 0; i < n; i++)
        data[i] = a[i];
    length = n;
}

template <class T>
T SeqList<T> :: Get(int i)
{
    if (i < 1 && i > length) throw "查找位置非法";
    else return data[i-1];
}

template <class T>
int SeqList<T> :: Locate(T x)
{
    for (int i = 0; i < length; i++)
        if (data[i] == x) return i+1;
    return 0;
}

template <class T>
void SeqList<T> :: Insert(int i, T 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 T>
T SeqList<T> :: Delete(int i)
{
    if (length == 0) throw "下溢";
    if (i < 1 || i > length) throw "位置错误";
    T x = data[i - 1];
    for (int j = i; j < length; j++)
        data[j-1] = data[j];
    length--;
    return x;
}

template <class T>
void SeqList<T> :: clearList() {
    length = 0;
}

template <class T>
void SeqList<T> :: PrintList()
{
    for (int i = 0; i < length; i++)
        cout << data[i] <<" ";
}

运行结果如下:
这里写图片描述

再利用上面的模板,使用顺序表来实现约瑟环问题。
// main.cpp

#include <iostream>
using namespace std;
#include "SequenList.cpp"
#define kCount 10

int main(int argc, const char * argv[]) {
    char a[kCount];
    int k = 97;
    for (int i = 0; i < kCount; i++) {
        a[i] = k++;
    }
    SeqList<char> list(a,kCount);

    int n = 6; // 报到6就删除
    int count = kCount; // 总数
    int i = 0; // 初始化
    while (count > 0) {
        for (int j = 1; j <= n; j++) {
            if (i == count) {
                i = 1;
            } else {
                i++;
            }
        }
        cout << "删除:" << list.Delete(i) << endl;
        cout << "剩下:";
        list.PrintList();
        cout << endl;
        count--;
        if (i >= 1) {
            i--;
        } else {
            i = count;
        }
    }
    return 0;
}

运行结果如下:
这里写图片描述

对查找操作的分析:上述模板中的按位查找算法的时间复杂度为O(1),按值查找算法的平均时间性能是O(n)。

使用顺序表之后,体会到顺序表拥有存储密度高、可随机存储结点的优点。但是上述顺序表始终是用简单数组实现的,长度为定值,在中途无法进行扩充。在插入和删除时,需要移动结点,效率低。

在算法上并没有什么新颖的地方,在解决约瑟环问题的main函数中的代码有待优化。若发现有何错漏,望读者指出。(๑•̀ㅂ•́)و✧

传送门:http://www.jianshu.com/u/1bed5943be92

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值