码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构笔记(二)--顺序表

时间:2015-04-23 09:39:40      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:数据结构   线性表   ds   seqlist   

线性表


线性结构:最常用,最简单的一种数据结构,其中的数据元素是有序且是有限的,其 基本特点:

  1. 存在一个唯一的被称为 第一个 的数据元素
  2. 存在一个唯一的被称为 最后一个 的数据元素
  3. 第一个元素外,每一个元素均有唯一 一个直接前驱
  4. 最后一个元素外,每一个元素均有唯一 一个直接后继

2.1 线性表的逻辑结构

2.1.1线性表的定义

线性表(Linear List) :是由n个数据类型相同的数据元素(结点)组成的有限序列.其中 n 为不小于0的整数.数据元素的个数 n 称为线性表的长度

相关术语:

  • 当 n = 0 时, 称为空表
  • 当 n > 0 时, 记为非空序列(a 0 ,a 1 ,a 2 ,?,a n  )
    • a 0   称为 首节点 , a n?1   称为 尾结点
    • 序号小于 i 的所有元素都是 a i  前驱 , 其中 a i?1  a i  直接前驱
    • 序号大于 i 的所有元素都是 a i  后继 , 其中 a i+1  a i  直接后继

2.1.2线性表的逻辑结构

结点的种类

  • 单值型元素 每个元素只有一个数据项(item)
  • 记录型元素 每个元素含有多个数据项.此时称每个数据项为结点的一个域,其中唯一标识每个结点的域组(一个或多个域) 被称为‘关键字’

2.2 线性表的顺序存储

2.2.1线性表的顺序存储结构

顺序存储 :把线性表的结点 按逻辑结构依次存放在一组地址连续的存储单元里. 此时简称为 顺序表
顺序表的特点:

  1. 线性表的逻辑顺序物理顺序一致
  2. 数据元素之间的关系是以元素在计算机内‘物理位置相邻’来体现
    相应的有如下类似的存储位置的关系表达式
    LOC(a i  )=LOC(a i?1  )+L ,其中 L 为 每个元素占用的存储单元
    LOC(a n  )=LOC(a i  )+(n-i)? L

2.2.2顺序表顺序表的描述与基本操作

基本操作:

  • 创建
  • 赋值
  • 查找
  • 修改
  • 插入
  • 删除
  • 求长度

顺序表的C++语言描述与实现

#include <stdio.h>   // for printf
#include <stdlib.h>  // for calloc,free
#include <string.h>  // for memmove
#define SEQLIST_DEFAULT_SIZE 10
///顺序表的C++语言描述
///说明 : 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]);
        }
    }

    int  find(T s){
        for(int i=0;i<curSize;i++) {
            if(data_[i] == s){
                return i;
            }
        }
        return -1;
    }
    //打印顺序表的信息
    void getInfo(){
        printf("SeqList[0x%x] capacity:%d, curLength:%d\n",data_,capacity,curSize);
    }
    ///插入
    bool insert(T elemInsert,int idxInsert=-1){
        ensureSize();
        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 isValidIndex(int idx) {
        if(idx < 0 || idx > curSize){
            return false;
        }
        return true;
    }
    int  length(){
        return curSize;
    }
private:
    T*  data_;
    int curSize;
    int capacity;

    //increase
    void ensureSize(){
        if(curSize<capacity){
            return;
        }       
        printf("[WARN]顺序表已满,自动扩展当前大小一倍\n");
        capacity<<=1;
        T* nb=(T*)calloc(capacity,sizeof(T));
        if(nb){
            memmove(nb,data_,curSize*sizeof(T));
            free(data_);
            data_=nb;
        }
    }   
    ///创建
    int init(int nSize=SEQLIST_DEFAULT_SIZE){
        data_=(T*)calloc(nSize,sizeof(T));
        if(NULL == data_){
            return -1;
        }
        capacity=nSize;
        curSize=0;
        getInfo();
        return 0;
    }
};
#ifndef DYLIB
int main(){
    SeqList<int> isl;
    int testArr[11]={40,41,42,43,44,140,142,143,144,145,146};
    //isl.init();
    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 

数据结构笔记(二)--顺序表

标签:数据结构   线性表   ds   seqlist   

原文地址:http://blog.csdn.net/liudglink/article/details/45208031

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!