动态分配线性表的顺序存储(Sequence List)

本文详细介绍了一种基于数组的线性表实现方法,包括初始化、插入、删除、查找等核心操作。通过C++代码展示了如何管理和操作线性表,适用于初学者理解和实践数据结构的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实多数操作跟静态分配链表差不多

#include<cstdio>
#include<cstdlib>

using namespace std;

#define InitSize 100

typedef struct{
    int *data;
    int length;
    int MaxSize;
} SeqList;


bool InitList(SeqList &seqlist);//初始化线性表:构造一个空的线性表
int Length(SeqList &seqlist);//求表长:返回线性表中元素的个数
int LocateElem(SeqList &seqlist, int elem);//按值查找:在线性表中查找指定元素并返回该元素的下标;若查找不到,返回"-5"
int GetElem(SeqList &seqlist, int iter);//按址查找:返回线性表中下标为iter的元素
bool ListInsert(SeqList &seqlist, int iter,int elem); //插入操作:将elem插入到线性表的下标为iter的位置
bool ListDelete(SeqList &seqlist, int iter, int &elem);//删除操作:删除表中iter位置上的元素,并用elem返回
void PrintList(SeqList &seqlist);//输出操作:按前后顺序输出线性表中的所有元素
void DestoryList(SeqList &seqlist);//销毁操作:销毁线性表,释放线性表占用的内存空间
bool Empty(SeqList &seqlist);//判空操作:若为空表,返回true,否则返回false


bool InitList(SeqList &seqlist)
{
    //C++风格
    seqlist.data = new int[InitSize];
    //C风格,需包含头文件cstdlib,或stdlib.h
    //seqlist.data = (int *)malloc(InitSize * sizeof(int));
    if(!seqlist.data)//判断是否成功分配内存,很关键
        return false;
    seqlist.length = 0;
    seqlist.MaxSize = InitSize;
    return true;
}

int Length(SeqList &seqlist)
{
    return seqlist.length;
}

int LocateElem(SeqList &seqlist, int elem)
{
    int len = seqlist.length;

    for (int i = 0; i < len;i++)
        if(seqlist.data[i]==elem)
            return i;
    return -5;//返回"-5"(意为“无”)
}

int GetElem(SeqList &seqlist, int iter)
{
    if(iter<0||iter>seqlist.length-1)
        return -32767;//这里用-32767表示下标越界,不知道是否严谨
    return seqlist.data[iter];
}

bool ListInsert(SeqList &seqlist, int iter,int elem)
{
    if (iter < 0 || iter > seqlist.length - 1 || seqlist.length + 1 > InitSize)
        return false;

    if(seqlist.data[iter]!=0)//这里我用0初始化线性表,所以0代表该位置没有元素,可以直接插入elem
    {
        for (int i = seqlist.length; i > iter;i--)
            seqlist.data[i] = seqlist.data[i - 1];
    }

    seqlist.data[iter]=elem;
    seqlist.length++;

    return true;
}

bool ListDelete(SeqList &seqlist, int iter, int &elem)
{
    if (iter < 0 || iter > seqlist.length - 1)
        return false;

    elem = seqlist.data[iter];

    int len = seqlist.length;
    for (int i = iter; i < len; i++)
        seqlist.data[i] = seqlist.data[i + 1];

    seqlist.length--;
    
    return true;
}

void PrintList(SeqList &seqlist)
{
    int len = seqlist.length;
    for (int i = 0; i < len;i++)
        printf("%d ", seqlist.data[i]);
}

void DestoryList(SeqList &seqlist)
{
    free(seqlist.data);
    seqlist.length = 0;
}

bool Empty(SeqList &seqlist)
{
    if (seqlist.length == 0)
        return false;
    return true;
}

int main()
{
    SeqList seqlist;

    InitList(seqlist);

    seqlist.length = 10;
    for (int i = 0; i < 10; i++)
        seqlist.data[i] = i * i;
    for (int i = 0; i < 10; i++)
        printf("%d ",seqlist.data[i]);

    
    getchar();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值