线性表之顺序表

 

顺序表

1.顺序表的定义

采用顺序储存结构储存的线性表通常简称为顺序表。

什么是顺序储存结构?

顺序储存结构是指:用一组地址连续的储存单元依次储存线性表的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理储存单元中。

2.顺序表的初始化

2.1构建结构体

#define MaxSize 100 //定义顺序表的最大长度
typedef struct {
    dataType data[MaxSize];//dataType 是自己定义的数据类型例如(int char double等等)
    int length;//length 记录表长
}Sqlist;

2.2赋值

2.2.1直接赋值

int main(){
    Sqlist L;
    L.data[0]=1;
    L.data[1]=2;
    L.length=2;//length的值要与data数组里的元素个数保持一致
}

2.2.2循环读取赋值

int main(){
    Sqlist L;
    L.length=0;
    int x,i=0;
    scanf("%d",&x);
    while(x!=9999)//当scanf读取到9999时 结束赋值
    {
        L.data[i]=x;
        L.length++;
        i++;
    }
}

3.顺序表的增(插入)

问题:在顺序表的第i个位置前插入一个元素e

3.1算法思想

  1. 判断表是否满了,满了无法插入

  2. 判断插入位置是否合法,不合法不能插入

  3. 从表尾开始,依次将元素后移1个位,直到第i个位置的元素付给i+1位置的元素

  4. 把第i个位置的元素的值赋为e

  5. 表长加一

3.2算法设计

int InsList(Sqlist& L, int i, int e)
/*在表L中第i个位置前插入元素e i的取值范围为0<i<=L.length+1*/
{
    int k;
    if (L.length == MaxSize - 1)
    {
        printf("表已经满了,无法插入。\n");
        return false;
    }
    if (i <= 0 || i > L.length+1)
    {
        printf("插入位置i有误。\n");
        return false;
    }
    for (k = L.length; k >= i - 1; k--) 
    {
        L.data[k] = L.data[k - 1];
    }
    L.data[i-1] = e;
    L.length++;
    return true;
}

4.顺序表的删除

问题:删除顺序表的第i个位置,并用指针指向它

4.1算法思想

  1. 判断表是否为空表,为空则不能进行删除

  2. 判断删除位置是否有误,有误不能删除

  3. 让e指向删除的元素

  4. 从i+1个元素开始,每个元素前移一个位,直到表尾的元素前移一位

  5. 表长减一

4.2算法设计

int DelList(Sqlist& L, int i, int * e)
/*删除表L中第i个位置的元素 i的取值范围为0<i<=L.length*/
{
    int k;
    if (L.length == 0)
    {
        printf("表为空,无法删除。");
        return false;
    }
    if (i <= 0 || i > L.length )
    {
        printf("删除位置i有误。\n");
        return false;
    }
    *e = L.data[i-1];
    for (k = i-1; k <L.length; k++)
    {
        L.data[k] = L.data[k + 1];
    }
    L.length--;
    return true;
}

5.顺序表的改

问题:将顺序表中的第i个元素的值修改成e

5.1算法思想

  1. 判断表是否为空,为空不能修改

  2. 判断修改的位置是否有误,有误不能修改

  3. 将e赋值给这个元素

5.2算法设计

int UpdataSqList(Sqlist &L,int i,int e) 
/*将表L中第i个位置的元素修改成e i的取值范围为0<i<=L.length*/
{
    if (L.length == 0)
    {
        printf("表为空,无法修改。");
        return false;
    }
    if (i < 1 || i > L.length )
    {
        printf("修改位置i有误。\n");
        return false;
    }
    L.data[i - 1] = e;
    return true;
}

6.顺序表的查

6.1按序号查询

问题:查询表中第i个位置的元素的值

6.1.1算法思想

  1. 判断表是否为空,为空不能查询

  2. 判断查询的位置是否有误,有误不能查询

  3. 将值直接返回

6.1.2算法设计

int LocateSqList1(Sqlist L,int i) 
/*查询表L中第i个位置的元素 i的取值范围为0<i<=L.length*/
{
    if (L.length == 0)
    {
        printf("表为空,查询失败。\n");
        return false;
    }
    if (i <= 0 || i > L.length)
    {
        printf("查询位置i有误。\n");
        return false;
    }
    return L.data[i - 1];
}

6.2按值查询

问题:查询e在表中的位置

6.2.1算法思想

  1. 判断表是否为空,为空不能查询

  2. 从第一个元素开始逐个扫描查询,判断元素的值是否等于e,并用i来记录查询的次数

  3. 如果一直到i=L.length-1仍不相等,则表内无此元素,查询失败

  4. 如果查询到该元素,返回其位置i

6.2.2算法设计

int LocateSqList1(Sqlist L,int e) 
{
    int i = 0;
    if (L.length == 0)
    {
        printf("表为空,查询失败。\n");
        return false;
    }
    for(i = 0;i < L.length;)
    {
        if(L.data[i] != e)
        {
            i++;
        }
        else
        {
            return i+1;
        }
    }
    if(i == L.length-1&&L.data[i] != e)
    {
        printf("表内无此元素,查询失败");
        return false;
    }
}

 

posted @   骆宾王  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示