线性表

线性表

  • 线性表(linear list ):元素组成的有限且有序的序列。
  • 所谓的线性指的是一个连着一个,并非数学或物理中的线性。
  • 特点:
    • 均匀性:每个元素数据类型相同
    • 有序性
  • 数学结构:
    • 二元组 B=(K,R)
    • K 为结点集合K={v0,v1,,vn}
    • R 为关系集合R={r}
    • 除了第一个结点外,所有结点都有前驱
    • 除了最后一个结点外,所有结点都有后继

逻辑结构

  • 线性结构:二元组 B=(K,R)
  • 长度(length),结点个数
  • 空表(empty list ),长度为0的表
  • 表头(head )
  • 表尾(tail )
  • 关系 r <script type="math/tex" id="MathJax-Element-518">r</script> 具有反对称性和传递性
//线性表的类模板
template <class T>
class List{
public:
    List();
    ~List();

    void clear();
    bool isEmpty();
    bool apend(const T value);
    bool insert(const int pos,const T value);
    bool delete(const int pos);
    bool setValue(const int pos,const T value);
    bool getValue(const int pos,T& value); //查找下标为pos的值,赋给value
    bool getPos(const T value,int& pos); //查找值为value的位置,赋给pos
}

存储结构

顺序表

  • 称为顺序表,或向量,用定长的一维数组实现的顺序存储结构。
//顺序表
template <class T>
class arrList:public class List{
private:
    T* aList;
    int maxSize;   //操作中顺序表可能达到的最大长度
    int curLen;
    int position;
public:
    arrList(const int size){
        maxSize = size; 
        aList = new T[maxSize];
        curLen = position = 0;
    }
    ~arrList(){ 
        delete [] aList;
    }

    void clear(){
        delete [] aList;
        position = curLen = 0;
        aList = new T[maxSize];
    }
    int length();
    bool apend(const T value);
    bool insert(const int pos,const T value);
    bool delete(const int pos);
    bool setValue(const int pos,const T value);
    bool getValue(const int pos,T& value); //查找下标为pos的值,赋给value
    bool getPos(const T value,int& pos); //查找值为value的第一个位置,赋给pos
};

链表

  • 链表(linked list ),通过指针来连接的变长的链式存储结构
  • 分类
    • 单链表(singly linked list ),
    • 双链表(double linked list )
    • 循环链表(circularly linked list )

单链表

//单链表的结点
template <class T>
class Link{
public:
    T data;
    Link<T>* next;

    Link(const T info,const Link<T>* nextValue = NULL){
        data = info;
        next = nextValue;
    }
    Link(const Link<T>* nextValue){
        next = nextValue;
    }

};

//单链表
template<class T>
class linkList{
private:
    Link<T>* head;
    Link<T>* tail;

    Link<T>* setPos(const int pos);
public:
    linkList(int s);
    ~linkList();

    bool isEmpty();
    void clear();
    int length();

    bool apend(const T value);
    bool insert(const int pos,const T value);
    bool delete(const int pos);
    bool getValue(const int pos,T& value); //查找下标为pos的值,赋给value
    bool getPos(const T value,int& pos); //查找值为value的第一个位置,赋给pos
}

双链表

//双链表的结点
template <class T>
class Link{
public:
    T data;
    Link<T>* next;
    Link<T>* prev;

    Link(const T info,const Link<T>* preValue = NULL,const Link<T>* nextValue = NULL){
        data = info;
        prev = preValue
        next = nextValue;
    }
    Link(const Link<T>* preValue = NULL,const Link<T>* nextValue){
        next = nextValue;
        prev = prevValue;
    }
};  

线性表的运算

顺序表

//插入算法
template<class T>
bool arrList<T>::insert(const int pos, const T value){
    if(curLen >= maxLength)
        return false;
    if(pos < 0 || pos >= curLen)
        return false;
    for(int i = curLen - 1;i >= pos;i--)
        aList[i+1] = aList[i];
    aList[pos] = value;
    curLen ++;
    return true;
}

//删除算法
template<class T>
bool arrList<T>::bool delete(const int pos){
    if(curLen >= maxLength || curLen <= 0)
        return false;
    if(pos < 0 || pos >= curLen)
        return false;
    for(int i = pos;i < curLen - 1;i++)
        aList[i] = aList[i+1];
    curLen --;
    return true;
}

单链表

  • 注意点
    • 对一个结点操作,首先必须找到它,即用一个指针指向它。
    • 头指针的处理
    • 插入或删除时指针的顺序
//查找算法
template<class T>
Link<T>* linkList<T>::setPos(const int pos){
    int count = 0;
    Link<T>* pointer = new Link<T>(head->next); //要new一个空间,并且从head->next开始
    while(p != NULL && count++ < pos)
        pointer = pointer->next; //如果pos大于链表长度则返回NULL
    return pointer;
}

//插入算法
template<class T>
bool linkList<T>::insert(const int pos,const T value){
    if(!setPos(pos-1))  
        return false;
    Link<T>* pointer = setPos(pos - 1); //使用检索函数简化算法
    Link<T>* node = new Link<T>(value);
    node->next = pointer-next;
    pointer->next = node;
    return true;
}

//删除算法
template<class T>
bool linkList<T>::delete(const int pos){
    if(setPos(pos - 1) == NULL)
        return false;
    Link<T>* pointer1 = setPos(pos - 1);
    Link<T>* pointer2 = pointer1->next;
    if(pointer2 == tail){  //删除尾部结点
        pointer1->next = NULL;
        tail = pointer1;
        delete pointer2;
    }
    else{  //正常删除结点
        if(pointer2 != NULL){
            pointer1->next = pointer2->next; //如此删除
            delete pointer2; //释放内存
        }
    }
    return true;
}

//求长度算法
template<class T>
int linkList<T>::length(){
    int count = 0;
    Link<T>* pointer = head->next;
    while(pointer != NULL)
    {
        pointer = pointer->next;
        count ++;
    }
    return count;
}

参考王腾蛟课件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值