第二章 线性表

第二章 线性表

定义:线性表是具有相同数据类型的n(n>=0)个**数据元素有限**序列。

“&”表示C++语言中的引用调用,在C语言中采用指针也可以达到相同的效果。

线性表主要操作(参考即可):

InitList(&L)		//初始化表。构造一个空的线性表。
Length(L)			//求表长。返回线性表L的长度,即L中数据元素的个数。
LocateElem(L,e)		//按值查找操作。在表L中查找具有给定关键字值的元素。
GetElem(L,i)		//按位查找操作。获取表L中的第i个位置的元素的值。
ListInsert(&L,i,e)	//插入操作。在表L中的第i个位置上插入指定元素e。
ListDelete(&L,i,&e)	//删除操作。删除表L中的第i个位置的元素,并用e返回删除元素的值。
PrintList(L)		//输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L)			//判空操作。若L为空表,则返回true,否则返回false。
DestoryList(&L)		//销毁操作。销毁线性表,并释放线性表L所占的内存空间。

线性表的顺序表示

定义:线性表的顺序存储又称顺序表

特点:

  1. 表中元素的逻辑顺序和物理顺序相同
  2. 最主要的特点是随机访问,具有随机存取的存储结构
  3. 通常用数组来描述
  4. 存储密度高,每个节点只存储数据元素。
  5. 拓展容量不方便(即使使用动态分配的方式实现,时间复杂度也比较高)
  6. 插入、删除操作不方便,需要移动大量元素

空间分配

静态分配

缺点:由于数组的大小和空间实现固定,一旦空间占满,再加入新的数据会导致溢出,进而程序崩溃。

#define MaxSize 50			//定义线性表的最大长度
typedef struct{
   				//定义结构体
    ElemType data[MaxSize];	//顺序表的元素
    int length;				//顺序表的当前长度
}SqList;					//定义结构体的名字为Sqlist
//定义了一个名为SqList的结构体
//SqList L;				//即声明一个SqList类型的变量L
//L.length;	L.data[i];	//获取成员变量
动态分配

存储数组的空间是在程序执行过程中,通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用以替换原本的存储空间。

#include<stdlib.h>			//malloc、free函数的头文件

#define InitSize 100		//表长度的初始定义

//定义结构体
typedef struct{
   				
    ElemType *data;		//指示动态分配数组的指针
    int MaxSize;		//数组的最大容量
    int length;			//数组的当前长度
}SqList;				//使用typedef将结构体命名为Sqlist

void InitList(SqList &L){
   
    //用malloc函数申请一片连续的存储空间
    L.data=(int*)malloc(InitSize*sizeof(int));
    L.length=0;
    L.MaxSize=InitSize;
}

void IncreaseSize(Sqlist &L,int len){
   
    //增加动态数组的长度
    int *p=L.data;			//“跟搬家公司说老房子的位置”	
    L.data=(int*)malloc((L.MaxSize+len)*sizeof(int));	//“买一个更大的房子”
    for(int i=0;i<L.length;i++){
   		
        L.data[i]=p[i];		//“将老房子的行李搬到新房子”:将数据复制到新区域
    }
    L.MaxSize=L.MaxSize+len;//	“将房产证的面积改成新房子的面积”:顺序表最大长度增加len
    free(p);				//“卖掉老房子”:释放原来的内存空间
}

int main(){
   
    SqList L;		//声明一个顺序表
    InitList(L);	//初始化顺序表
    //往顺序表中随便插入几个元素
    IncreaseSize(L,5);	
    return 0;
}

基本操作

插入操作

在顺序表的第i个位置插入新元素e。

时间复杂度:最好O(1)、最差O(n)、平均O(n)

//'&L'表示取L的地址,直接通过地址对L进行操作,不用返回值,因为操作的就是L本体。
bool ListInsert(SqList &L, int i, ElemType e){
   	
    if (i<1||i>L.length+1)			//判断i的范围是否有效
        return false;
    if(L.length>=MaxSize)			//存储空间满,不能插入
        return false;
    for(int j=L.length;j>=i;j--)	//将第i个元素及之后的元素后移
        L.data[j]=L.data[j-1];		
    L.data[i-1]=e;					//在位置i处放入e
    L.length++;						//线性表长度加1
    return true;
}
//注意区分顺序表的位序和数组下标,位序从1开始,下标从0开始
删除操作

删除顺序表L中第 i ( i <= i <= L.length)个位置的元素,用引用变量e返回。

时间复杂度:最好O(1)、最差O(n)、平均O(n)

bool ListDelete(SqList &L, int i, ElemType &e){
   
    if (i<1||i>L.length)			//判断i的范围是否有效
        return false;
    e=L.data[i-1];					//将被删除的元素赋值给e
    for(int j=i;j<L.length;j--)		//将第i个元素及之后的元素前移
        L.data[j]=L.data[j-1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值