标签:
线性结构 基本特点: 在* 同构 的N个数据元素的 非有限集 *中
故此,有线性表如下的定义 : 
 一个线性表是 n 个同构的数据元素的有限序列.
其特征如下:
数据元素又称为 结点,其种类有:
顺序表 :把线性表的结点按逻辑结构依次存放在一组地址连续的存储单元里.  
顺序表的特点:
基本操作:
顺序表的C++实现
#include <stdio.h>   // for printf
#include <stdlib.h>  // for calloc,free
#include <string.h>  // for memmove
#define SEQLIST_DEFAULT_SIZE 10
///说明 : T 必须支持[]操作的复合类型,或者是基本类型
template<typename T>
struct SeqList {
public:
    SeqList(int size=SEQLIST_DEFAULT_SIZE) {
        init(size);
    }
    bool delete(int idxDelete,T* saveOut=NULL){
        //顺序表不为空,并且 idxDelete 在合理范围内
        if(curSize && idxDelete>=0&& idxDelete<=curSize) {
            if(saveOut)
                *saveOut=data[idxDelete];
            for(int i=idxDelete;i<curSize;i++)
                data[i-1]=data[i];
            curSize--;
            return true;
        }
        return false;
    }
    void display(){
        getInfo();
        for(int i=0;i<curSize;i++){
            printf("%d elem is %d\n",i,data[i]);
        }
    }
    //查找数据 s 是否在表里面
    //s 不在表里面,返回-1,否则返回 s 在表里的下标
    int  find(T s){
        for(int i=0;i<curSize;i++) {
            if(data[i] == s){
                return i;
            }
        }
        return -1;
    }
    //打印顺序表的信息
    void getInfo(){
        printf("顺序表[0x%x] 容量:%d,当前大小:%d\n",data,capacity,curSize);
    }
    ///插入
    bool insert(T elemInsert,int idxInsert=-1){
        //数据元素已经满员但是扩容失败了
        if(curSize>=capacity-1 && 0 != enlargeSize())
            return false;
        if(idxInsert>0){
            for(int j=curSize-1;j>=idxInsert;j--){
                data[j+1]=data[j];
            }
            idxInsert--;
        }else{
            idxInsert=curSize;
        }
        data[idxInsert]=elemInsert;
        curSize++;
        return true;
    }
    bool isFull(){
        return curSize+1>=capacity;
    }
    bool isEmpty(){
        return curSize==0;
    }
    bool isValidIndex(int idx) {
        if(idx < 0 || idx > curSize){
            return false;
        }
        return true;
    }
    int  length(){
        return curSize;
    }
private:
    T*  data;
    int curSize;
    int capacity;
    //扩容操作
    //返回0 已经成功扩容了一倍
    //返回-1,扩容失败
    int enlargeSize(){
        capacity <<= 1;
        T* nb=(T*)calloc(capacity,sizeof(T));
        if(nb){
            memmove(nb,data,curSize*sizeof(T));
            printf("[TIP]SeqList(0x%x)已满,自动扩展当前大小一倍\n",data);
            data=nb;
            return 0;
        }
        return -1;
    }
    ///初始化
    int init(int nSize=SEQLIST_DEFAULT_SIZE){
        data=(T*)calloc(nSize,sizeof(T));
        if(!data){
            return -1;
        }
        capacity=nSize;
        curSize=0;
        return 0;
    }
};
#ifndef DYLIB
int main(){
    SeqList<int> isl;
    int testArr[11]={40,41,42,43,44,140,142,143,144,145,146};
    for(int i=0;i<sizeof(testArr)/sizeof(testArr[0]);i++) {
        isl.insert(testArr[i]);
    }
    isl.display();
    //insert again
    for(i=0;i<sizeof(testArr)/sizeof(testArr[0]);i++) {
        isl.insert(testArr[i]);
    }
    isl.display();
    return 0;
}
#endif标签:
原文地址:http://blog.csdn.net/liudglink/article/details/45227931