C#交流俱乐部

学习为主,互相帮助

博客园 首页 新随笔 联系 订阅 管理

半吊子水准·几次修改,哎~GetIdx只能用在insert Set,不能用在remove函数内,具体是getidx的实现考虑到插入的时候可自动追加数组末尾等原因

 SeqList.h代码如下

/* 
 * File:   SeqList.h
 * Author: bluce
 *
 * Created on 2013年1月6日, 下午5:36
 */

#ifndef SEQLIST_H
#define    SEQLIST_H
#include <iostream>

template<class T>
class SeqList {
public:
    SeqList(int Size=64);//构造函数
    SeqList(T value[],int value_len);//构造函数
    virtual ~SeqList();
    bool isEmpty();//方法判断顺序表是否为空
    int length();//返回顺序表的长度
    T get(int i);//返回顺序表相应位置的数据
    bool set(int i,T x); 
    void insert(int i,T x);//在相应位置插入数据
    void insert(T x);//在顺序表末尾插入数据
    bool remove(int i);//移除相应位置的数据
    void clear();//清空顺序表
    void SeqList<T>::Debug();
private:
    T *element;//顺序表
    int size;//顺序表的容量
    int len;//数组的大小
    int getIdx(int i);//得到当前的索引
};

template <class T>
int SeqList<T>::getIdx(int i)
{
    i=i<0?this->len:i;//索引不存在则追加末尾
    i=i<=this->len?i:this->len-1;
    return i;
} 
template <class T>
SeqList<T>::SeqList(int size) {
    this->size=size<64?64:size;
    this->element=new T[this->size];//申请一个双倍的空间
    this->len=0;
}

template <class T>
SeqList<T>::SeqList(T value[],int value_len) {
    if(value_len>0)
    {
        this->size=2*value_len;
        this->element=new T[this->size];//申请一个双倍的空间 
        this->len=value_len;//更改长度
        for(int i=0;i<value_len;i++)
        {
            this->element[i]=value[i];//复制数据
        }
    }
}

template <class T>
SeqList<T>::~SeqList() {
    delete[] this->element;
    this->element=NULL;
    this->len=0;
    this->size=0;
}

template<class T>
bool SeqList<T>::isEmpty()//判断链表是否为空
{
    return this->len==0;//
}

template<class T>
int SeqList<T>::length()
{
    return this->len;
}

template<class T>
T SeqList<T>::get(int i)
{  
    i=getIdx(i);
    if(i>0)
        return this->element[i];
    else
        return this->element[0];
}

template<class T>
bool SeqList<T>::set(int i,T x)
{
    //i=i>=this->len?this->len-1:i;
    i=getIdx(i);
    if(i>=0)
    {
        this->element[i-1]=x;
        return true;
    }
    else
    {
        return false;
    }
} 
template <class T>
void SeqList<T>::insert(int i,T x)
{    
    i=getIdx(i);
    if(this->len==this->size)//如果数组已满,重新分配存储区
    {
        T *temp=this->element;//定义数组指针并赋值
        this->element=new T[len*2];
        this->size*=2;
        for(int idx=0;idx<this->len;idx++)
        {
            this->element[idx]=temp[idx];
        }
        delete[] temp; //删除指针
        temp=NULL;
    }
    if(i<this->len)//i已经-1
    { 
        for(int j=this->len-1;j>=i;j--)//后移
            this->element[j+1]=this->element[j];
    }   
    this->element[i]=x;
    this->len+=1;
}  

template <class T>
void SeqList<T>::insert(T x)
{
    insert(this->len,x);
}

template <class T>
bool SeqList<T>::remove(int i)
{ 
    i=(i!=0)?i-1:0;//索引自减1
    if(i>=0&&i<this->len)
    {//移除其实就是对移除的之后项进行左移操作,对于空间大小不必处理
        for(i;i<this->len;i++)
        {
            this->element[i]=this->element[i+1];
        }
        this->len-=1;
        return true;
    }
    else
    {
        return false;
    }
}

template <class T>
void SeqList<T>::clear()
{
    this->len=0;
    delete[] this->element;
    this->element=new T[this->size];
}

template<class T>
void SeqList<T>::Debug(void)
{
    std::cout<<"---------- debug ----------"<<std::endl;
    std::cout<<"SeqList Size:"<<this->size<<std::endl;
    if(this->len>0)
    {
        std::cout << this->element[0];
        for(int i=1;i<this->len;i++)
        {
            std::cout <<","<<this->element[i];
        }
        std::cout <<std::endl;
    }
} 

#endif    /* SEQLIST_H */

 

welcome.cc 测试代码

#include <iostream>
#include <string>
#include "SeqList.h"

#define MAXSIZE 20 //顺序表的最大长度

    int main()  
    {
using namespace std;
        char t[5]={'a','b','c','f','g'};
        SeqList<char> S(t,5);
        S.Debug();
        S.insert(4,'d');
        S.insert(5,'e');
        S.insert('h');
        S.insert('i');
        S.insert('j');
        S.insert('k');
        S.insert('l');
        S.Debug();
        S.set(1,'x'); 
        S.set(2,'y'); 
        S.Debug();
        S.remove(0);
        S.Debug();
        S.remove(S.length());
        S.Debug();
        S.~SeqList();
        S.Debug();
        return 0;

 } 

执行结果~

---------- debug ----------
SeqList Size:10
a,b,c,f,g
---------- debug ----------
SeqList Size:20
a,b,c,f,d,e,g,h,i,j,k,l
---------- debug ----------
SeqList Size:20
x,y,c,f,d,e,g,h,i,j,k,l
---------- debug ----------
SeqList Size:20
y,c,f,d,e,g,h,i,j,k,l
---------- debug ----------
SeqList Size:20
y,c,f,d,e,g,h,i,j,k
---------- debug ----------
SeqList Size:0

运行 SUCCESSFUL (总时间:  78ms)

posted on 2013-01-08 18:43  bluce chen  阅读(428)  评论(1)    收藏  举报