数据结构笔记--线性表(上)

2.0 线性表的定义与基本运算

线性结构 基本特点: 在* 同构 的N个数据元素的 非有限集 *

  • 存在唯一的一个被称作为“第一个” 的数据元素
  • 存在唯一的一个被称作为“最后一个” 的数据元素
  • 除第一个外,集合中的每个数据元素均只有一个直接前驱
  • 除最后一个外,集合中的每个数据元素均只有一个直接后继

故此,有线性表如下的定义 : (a 1 ,a 2 ,a 3 ,?,a n )

 一个线性表是 n 个同构的数据元素的有限序列.

特征如下:

  • 元素是同构的,且不能出现缺项 (即:每对相邻的两元素之间的步长均是1)
  • 记元素个数 n 作表的长度.
    • 当 n = 0时,记作 空表
    • 当 n > i > 1 时,
      • a i 的直接前驱是a i?1 ;其直接后继是a n+1
      • 若表不是循环表,则 a 1 无前驱,a n  无后继

2.1 线性表的逻辑结构

数据元素又称为 结点,其种类有:

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

2.2 线性表的存储结构

2.2.1 顺序表(线性表的顺序存储结构)

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

顺序表的特点:

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

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

    LOC(a i )=LOC(a i?1 )+L

    LOC(a n )=LOC(a i )+(n?i)?L

    其中 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

///说明 : 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
时间: 2024-08-09 10:43:03

数据结构笔记--线性表(上)的相关文章

数据结构笔记--线性表(下)

2.2.3 链表(线性表的链式存储结构) 链表: 用一组任意的存储单元来存储线性表中的数据元素,并用指针域实现逻辑上相邻的关系 特点: 链表中的结点的逻辑顺序和物理顺序不一定相同. 每个结点a i  ,除存储本身信息外,还需存储a i+1  的位置的信息 结点结构的组成: 数据域: 元素本身信息 指针域: 指示直接后继的存储位置 是一种动态结构,不需要预先分配空间 指针占用额外的存储空间 不能随机存取,查找速度慢 相关术语: 链表是由表头唯一确定,因此可以用头指针的名字来命名链表. 单链表 每个

数据结构学习笔记——线性表的应用

数据结构学习笔记——线性表的应用 线性表的应用 线性表的自然连接 计算任意两个表的简单自然连接过程讨论线性表的应用.假设有两个表A和B,分别是m1行.n1列和m2行.n2列,它们简单自然连接结果C=A*B(i==j),其中i表示表A中列号,j表示表B中的列号,C为A和B的笛卡儿积中满足指定连接条件的所有记录组,该连接条件为表A的第i列与表B的第j列相等. 如:         1 2 3                3 5 A  =  2 3 3         B =  1 6       

[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列

python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构时,这些高级的数据结构可能给我们以迷惑. 比如,使用list实现queue的时候,入队操作append()时间复杂度可以认为是O(1),但是,出队操作pop(0)的时间复杂度就是O(n). 如果是想利用python学学数据结构的话,我觉得还是自己实现一遍基本的数据结构为好. 1.链表 在这里,我想使

软考之路--数据结构之线性表

数据就是数值,也就是我们通过观察.实验或计算得出的结果.数据有很多种,最简单的就是数字.数据也可以是文字.图像.声音等.数据可以用于科学研究.设计.查证等.结构,组成整体的各部分的搭配和安排,两者完美结合在一起,我们这样需要重新认识她,对她重新审视与定义:数据结构是程序设计的重要理论和技术基础,她所讨论的内容和技术,对从事软件项目的开发有重要作用,通过学习数据结构,我们学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所设计的数据悬着适当的逻辑结构.存储结构及其相应的操作方法,为提高应

数据结构:线性表之单链表

线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表有两种存储结构: ①顺序存储结构,即存储单元在一段连续的地址上存储,常见的数组就是顺序存储结构的线性表: ②链式存储结构,即存储单元在不连续的地址上存储.因为其不连续性,除了要存数据元素信息(数据域)外,还要存储它后继元素(结点)的地址(指针域,链).学习链式结构最好将结点结构牢记于心,如下图: 链表的每个结点只含有一个指

自学数据结构——顺序线性表

胡乱写了一些代码 /* ============================================================================ Name : sqlist.c Author :codecup Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-style ==========================================

自学数据结构——顺序线性表2

1 /* 2 ============================================================================ 3 Name : sqlist.c 4 Author : codecup 5 Version : 6 Copyright : Your copyright notice 7 Description : Hello World in C, Ansi-style 8 ==================================

数据结构:线性表插入一次删除一次的代码

#include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cstdio> using namespace std; int insertsqlist(int weizhi,double charu,int *t,double b[]){   

数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点. 其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如 1.线性表是一个序列,它是有顺序的(排队) 2.第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个) 3.元素是有限的(小学生的个数是有限的) 4.数据类型都相同(都是小学生在排队) 说明白线性表示什么,下面我们直接看线性表的实现 线性表的实现分顺序存储结构和链式存储结构 顺序存储结构: #define LI