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

线性表



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

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

2.1 线性表的逻辑结构

2.1.1线性表的定义

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

相关术语:

  • 当 n = 0 时, 称为空表
  • 当 n > 0 时,
    • A0 称为 首节点
    • An-1 称为 尾结点
    • 序号小于 i 的所有元素都是 Ai 的前驱

      其中 Ai-1 是 Ai 的直接前驱

    • 序号大于 i 的所有元素都是 Ai 的后继

      其中 Ai+1 是 Ai 的直接后继

2.1.2线性表的逻辑结构

结点的种类

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

2.2 线性表的顺序存储

2.2.1线性表的顺序存储结构

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

顺序表的特点:

  1. 线性表的逻辑顺序物理顺序一致
  2. 数据元素之间的关系是以元素在计算机内‘物理位置相邻’来体现

    相应的有如下类似的存储位置的关系表达式

    LOC(Ai)=LOC(Ai-1)+L ,其中 L 为 每个元素占用的存储单元

    LOC(An)=LOC(Ai)+(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);
    }
    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 
时间: 2024-08-02 10:57:51

数据结构笔记(二)--顺序表的相关文章

数据结构 --- 02. 内存, 顺序表, 单链表

一.内存 1.基本概念 计算机的作用: 就是用来存储和运算二进制的数据 变量的概念: 就是计算机中的某一块内存空间   衡量计算机内存大小的范围: bit byte kb mb 计算机中内存空间都会有两个基本的属性 大小 地址 不同数据占用内存空间的大小 整数:4byte float:4byte double:8byte 字符:1byte 理解a=10的内存图(引用,指向) 指向:如果一个变量存储了某一块内存空间的地址,则表示该变量指向该块内存 引用:如果一个变量存储了某一块内存空间的地址,则该

C#(数据结构):1.顺序表结构(2)

人生总有那么多未完的篇章,但是有时候今天你没完成的可能你以后再也不会完成.承诺的一切兴许也变成了过眼云烟.想抓住,握紧的拳头却使他们溜的更快.人生恰如初见,几多的欣喜. ----------------------------------------------------------------------------------------------万恶的分割线------------------------------------------------ 分割线都受不了了.好吧之前我们说

C#(数据结构):1.顺序表结构

我们程序员有三大优点:懒.困.自负.很荣幸我这三点都占了.但是木有关系这丝毫动摇不了我学习的决心.因为技术没有止境. -------------------------------------------------------------------------------------万恶的分割线------------------------------------------------------ 一个人生的分割线. 曾多少次我告诉自己要和昨天的自己说再见.不带走自己的过去,新中幻想着永

C#(数据结构):1.顺序表结构(3)

程序员的道路艰难险阻,如果有新生派的小学生问我他可以做程序员吗?我会毫不犹豫的告诉他放下程序立地成佛,千万不要踏足这一行.虽然这行妹子很多,但是勿来,勿入,勿学.不要问我为什么,说多了全是泪... -----------------------------------------------------------------------------------万恶的分割线------------------------------------------------- 好吧情感戏也就这么多了,

数据结构笔记之线性表

线性表即链表,基本特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,其他么个数据元素都有一个前驱和后继.是最基本且最常用的一种线性结构. 2.1线性表的定义和特点 由n(n>=0)个数据特性相同的元素否城的有限序列成为线性表,n为线性表长度,当n=0称空表. 举例:1.26个英文字母的字母表是一个线性表,数据元素是单个字母. 2.学生信息表中,每一个学生为一个数据元素,包括学号.姓名.性别等等数据项. 2.2案例:图书信息管理系统. 2.3线性表的类型定义 线性表是一个相当灵活的数据结构

【数据结构】之顺序表和链表的比较

1.顺序表 顺序表的优点: (1) 方法简单,各种高级语言中都有数组,容易实现.(2) 不用为表示结点间的逻辑关系而增加额外的存储开销.(3) 顺序表具有按元素序号随机访问的特点. 顺序表的缺点: (1) 在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低.(2) 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢出. 2.链表 链表的优点: (1) 在链表中做插入删除操作时,不会影响前面和后面的节点,因此对n较大的链表

数据结构实践项目——顺序表

[项目1 - 顺序表的基本运算] 领会"0207将算法变程序"部分建议的方法,将顺序表部分的算法变成程序. 实现顺序表基本运算有算法(对应视频0204创建线性表的实现和0205顺序表基本运算的实现),依据"最小化"的原则进行测试.所谓最小化原则,指的是利用尽可能少的基本运算,组成一个程序,并设计main函数完成测试. 作为第一个这种类型的实践(后续每一部分均有这种实践,这是我们学习的基础,也是实践成果积累的基础),结合相关的算法,给出建议的过程: (1)目的是要测试

【数据结构】之顺序表(Java语言描述)

之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中,为我们提供了专门的顺序表的数据结构API-- ArrayList . Java中的ArrayList的基本存储思路和C语言中的思路相似,即将所有元素存储在一个数组中,当数组中的元素个数达到某种标准时,就要扩容.由于顺序表中的其他操作在Java和C中的实现方式大同小异,因此,本文不再详细介绍这些操作

数据结构实现之顺序表

所谓数据结构,就是定义一组有关系的数据以及在这些数据上的操作,也就是ADT(抽象数据类型). 包括三个方面; ADT List{ 数据对象:  数据关系:基本运算:} 以顺序表为例,它的顺序存储类型: typedef struct { ElemType data[MaxSize]; // <span style="font-family: Arial, Helvetica, sans-serif;">ElemType存放数据类型</span> int lengt