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

先给出书上关于顺序存储定义

  • 线性表的顺序存储结构(先称它顺序表),指的是用一段地址连续的存储单元依次存储线性表的数据元素
  • 就拿数组来说吧,以长度为 100 的数组,从它的开始连续的存储数据,其中那段存储了数据部分随着存入的数据增多,其长度也在变化。

顺序表的结构体定义如下

typedef int ElemType;
typedef struct SqList
{
    ElemType data[MAXSIZE];   //变量类型暂时以int型开始
    int len;
} SqList;
  • 由上述情况可知,描述顺序存储结构需要三个属性:
  1. 存储空间的起始位置:数组 data ,它的存储位置就是存储空间的存储位置;
  2. 线性表的最大存储容量:数组长度 MAXSIZE ;
  3. 线性表的当前长度:len。

书中还表示了数据长度与线性表长度的区别

  • 数组的长度是存放线性表的存储空间的长度,存储分配后这个量一般是固定的,如果用动态分配数组,会带来性能上的损耗**(由于动态分配有一层构建生长对象的意思在里面,而在构建生长对象时,需要经常地检查当前的块是否还有足够的空间来存放新的数据,这带来了额外的性能损耗。如果你构建对象时频繁地增长,这个损耗就比较明显了。)**;
  • 线性表的长度是线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的;
  • 在任意时刻,线性表的长度应该小于等于数组的长度。

顺序表的抽象数据类型定义

ADT 顺序表 (SqList)
Data:顺序表的数据对象集合为(data[1],data[2]...data[n]), 每个元素类型自定义, 其中,除第一个元素外,每一个元素有且只有一个直接前驱元素,除了最后一个元素外,每一个元素有且只有一个直接后续元素。数据元素之间是一对一的关系
基本操作:
	InitList(&L);  初始化顺序表
	CreatList(&L); 构建顺序表
	InsertList(&L, i, a);  在顺序表的第 i 个位置插入元素 a
	ListDelete(&L, d, e);  删除顺序表中第 d 个位置的元素并返回该元素的值
	MergeList(L, L2);      合并两个顺序表
	Find(L, e);           查找元素 e ,并返回其位置
	Clear(L);             清除顺序表
	Update(L, i, e);      修改第 i 个位置上的元素,并改为 e
	..............

代码

#include <stdio.h>

//(为了提升自己渣渣的英语水平,注释尽量用英文)
#define MAXSIZE 100  //储存空间初始化分配

typedef int ElemType;
typedef struct SqList
{
    ElemType data[MAXSIZE];   //变量类型暂时以int型开始
    int len;
} SqList;

/*
SqList InitList()
{
    SqList L;
    L.len = 0;
    return L;
}
*/
void InitList(SqList *L)
{
    L->len = 0; //The length of the sequence table is 0(顺序表的长度为0)
}

void CreatList(SqList *L)
{
    int a;
    printf("Please enter the value (about a) to be stored in the sequence table, and '0' indicates the end of the input\n");
    while (scanf("%d", &a) != EOF)
    {
        if (a == 0)
        {
            break;
        }
        L->data[L->len] = a;
        L->len++;
    }
}

void InsertList(SqList *L, int i, ElemType a)
{
    if (L->len == MAXSIZE)
    {
        printf("Sequence table is full!\n");
        return;
    }
    if (i < 1 || i > L->len)
    {
        printf("'i' is error");
        return;
    }
    if (i <= L->len)
    {
        for (int j = L->len - 1; j >= i - 1; j--)
        {
            L->data[j + 1] = L->data[j];
        }
        L->data[i - 1] = a;
        L->len++;
    }
}

bool IsEmpty(SqList *L)
{
    return (L->len == 0 ? true : false);
}

void ListDelete(SqList *L, int i, ElemType &e)
{
    //Is the Sequence table empty?
    if (IsEmpty(L))
    {
        printf("The table is rmpty!\n");
        return;
    }

    if (i < 1 || i > L->len)
    {
        printf("'i' is error");
        return;
    }
    e = L->data[i - 1];
    if (i <= L->len)
    {
        for (int j = i-1; j < L->len; j++)
        {
            L->data[j] = L->data[j + 1];
        }
    }
    L->len--;
}

SqList MergeList(SqList L1, SqList L2)
{
    //Merged into an order table
    SqList L3;
    L3.len = 0;
    int i = 0, j = 0, k = -1;
    while (i < L1.len && j < L2.len)
    {
        if (L1.data[i] <= L2.data[j])
        {
            L3.data[++k] = L1.data[i++];
        }
        else
        {
            L3.data[++k] = L2.data[j++];
        }
    }

    //L2 is empty, copy the rest of L1 to L3
    while (i < L1.len)
    {
        L3.data[++k] = L1.data[i++];
    }

    //L1 is empty, copy the rest of L2 to L3
    while (j < L2.len)
    {
        L3.data[++k] = L2.data[j++];
    }
    L3.len = k + 1;
    return L3;

}

int main()
{
    SqList L;

    InitList(&L);   //Initilization sequence table(初始化顺序表(注释尽量用英文来提升自己的英语水平))
    //L = InitList();

    CreatList(&L);  //Creat the sequence table

    int a;       //'a' indicate that number to insert (a代表要插入的数字)
    int i;   //'i' indicate where to insert(i代表要插入的位置)
    printf("Please enter the number to insert: ");
    scanf("%d", &a);
    printf("Please enter the number where to insert: ");
    scanf("%d", &i);
    InsertList(&L, i, a);  //start to insert
 /*   for (int j = 0; j < L.len; j++)
    {
        cout << L.data[j] << " ";
    }
    */
    int e;  //'e' indicates the deleted element(e表示删除的元素)
    int d;  //'d' indicates where to delete(d表示要删除元素的位置)
    printf("Please enter the number where to delete: ");
    scanf("%d", &d);
    ListDelete(&L, d, e);
	printf("e: %d", e);

    SqList L2;

    InitList(&L2);   //Initilization sequence table

    CreatList(&L2);  //Creat the sequence table

    SqList L3;

    InitList(&L3);

    L3 = MergeList(L, L2);  //Merge sequence table

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值