数据结构之线性表

一、线性表

(一)线性表的顺序储存表示

一般一个顺序表由两个部分描述:
    1.一个名为elem的数组,大小为MAXSIZE
    2.一个整数来存储元素个数。
静态方式:
#define MAXSIZE 100
    typedef struct{
        ElemType elem [MAXSIZE];
        int length
    } SqList
动态方式:
    typedef struct{
        ElemType *elem ;
        int length ;
    } SqList
L.elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE)
sizeof(ElemType)*MAXSIZE-计算 ElemType类型的MAXSIZE所占据的空间
通过 malloc函数来开辟空间
通过(ElemType *)来划分开辟空间的区域,如:字符类型就8个空间一组
// malloc(m)函数    开辟m字节长度的地址空间 返回这段空间的首地址
// sizeof(x)运算    计算变量x的长度
// free(p)函数       释放指针p所指变量的存储空间,即彻底删除一个变量

(二)线性表的操作

1.线性表L的初始化

Status InitList_Sq(SqList &L){    //构建一个空的顺序表L
    L.elem=new ElemType[MAXSIZE]  // 为顺序表分配空间
    if(!L.elem) exit (OVERFLOW)   // 判断如果为空则表明分配失败,弹出报错 
    L.length=0                    // 空表长度初始化为0
    return OK                        
}
Statues 表示函数的类型,其值是函数是结果状态码

2.线性表L的简单算法

// 销毁线性表L
void DestroyList (SqList &L){
    if (L.elem) delte L.elem     //    释放存储空间
}
//清空线性表L
void ClearList (SqList &L) {
    L.length=0        //将线性表长度置为零,但是空间仍然占据。
}
//求线性表L的长度
int GetLength (Sqlist L) {
    return (L.length)
}
//判断线性表L是否为空
int IsEmpty (SqList L){
    if(L.length==0) return 1;
    else return 0;
}

 3.顺序表的取值(根据位置i获取相应位置数据元素的内容)

int GetElem (SqList L, int i, ElemType &e) {
    if (i<1 || i>L.length) return ERROR    //判断输入的i值是否合理,如果不合理,返回 ERROP
    e = L.elem[i-1]                        //第i-1的单元储存着第i个数据
    return OK
}

4.顺序表的查找

int LocateElem(SqList L, ElemType e) {
    for (i=0;i<L.length;i++){    //在线性表L中查找值为e的数据元素,返回其序号
        if(L.elem[i] == e) return i+1  //查找成功,返回序号
    }
    return 0 //查找失败,返回0
}

平均查找长度 ASL(Average Search Length):
    为确定记录在表中的位置,需要与给的值进行比较的关键字的个数的期望值叫查找算法的平均查找长度

5.顺序表的插入

顺序表的插入就是在表的第i个位置上,插入一个新节点e,使长度为n的线性表变为长度为n+1的线性表
在线性表L的第i个位置插入e
    Status Listlnsert_Sq(SqList &L, int i, Elemtype e) {
        if (i<1 || i>L.length+1) return ERROR  //判断i是否合法
        if (L.length == MAXSIZE) return ERROR  //当前存储空间已满
        for(j=L.length+1; j>=i+1; j++){        //将插入位置以之后的元素后裔
            L.elem[j+1] = L.elem[j]            
        }
        L.elem[i-1] = e                        //将元素插入i
        L.length++                             //表长+1
        return OK
    }

 6.顺序表的删除

顺序表的删除就是在表的第i个位置上,删除一个新节点e,使长度为n的线性表变为长度为n-1性表
在线性表L的第i个位置插入e
    Status Listlnsert_Sq(SqList &L, int i, Elemtype e) {
        if (i<1 || i>L.length+1) return ERROR  //判断i是否合法
        for(j=i; j<=L.length-1; j++){        //将插入位置以之后的元素后裔
            L.elem[j-1] = L.elem[j]            
        }                    
        L.length--                             //表长-1
        return OK
    }

 

总结

利用数据元素的存储位置表示线性表中相邻数据之间的前后关系,即线性表的逻辑结构与存储结构一致

在访问线性表时,可以快速的计算出出任何一个数据元素的存储地址,可以粗略认为每个元素所花时间相等

这种存取元素的方法被称为随机存取发

查找、插入、删除算法的平均时间复杂度为O(n),空间复杂程度为S(n) = O(1)

posted @   铜须的编程生活  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示