顺序表的简单实现

顺序表的简单实现

基于c++的简单实现顺序表,动态管理内存
本人萌新,如果有哪个术语或者代码思路有问题,欢迎指正,谢谢!!!

1.自定义结构体,存储数据

//常量定义
#define InitSize 10
#define AddSize 5

// 定义结构体顺序表
typedef struct sqList
{
    /* data */
    // 存储数据
    int *data;    // 动态添加数据
    int max_size; // 表示一次性能存储多少个数据
    int length;   // 表示有多少个数据
} SqList;

2.初始化顺序表

// 初始化顺序表
void InitList(SqList &s)
{
    s.data = (int *)malloc(InitSize * sizeof(int));
    s.max_size = InitSize;
    s.length = 0;
    for (int i = 0; i < s.max_size; i++)
    {
        /* code */
        /* if (i < 5)
        {
            s.data[i] = i * i;
            s.length++;
        }
        else
        {
            s.data[i] = 0;
        } */
        //这样定义数据是为了查看扩容是否成功
        s.data[i] = i * i;
        s.length++;
    }
}

3销毁开辟的数据空间

在内存中开辟了空间就要记得销毁,防止内存泄漏

// 销毁顺序表
void DestroyList(SqList &s)
{
    free(s.data);
}

4.顺序表的打印

先写该代码是为了方便查看最后的结果是否正确,比如顺序表是否正确的初始化了

// 打印顺序表
void PrintList(SqList &s)
{
    for (int i = 0; i < s.length; i++)
    {
        /* code */
        printf("%d\t", s.data[i]);
    }
    printf("\n");
}

5.往顺序表中插入数据

如果插入数据过多,空间会不够,为了空间足够这里先写数组扩容的代码

// 动态开辟空间
// 第一个参数表示需要扩容的空间
// 第二个参数表示需要扩容的大小
void ExpandList(SqList &s, int n)
{
    int *dataArr = (int *)malloc((s.max_size + AddSize) * sizeof(int));
    for (int i = 0; i < s.length; i++)
    {
        /* code */
        dataArr[i] = s.data[i];
    }
    s.data = dataArr;
    s.max_size = InitSize + AddSize;
}


// 插入元素
// 第一个参数表示需要插入元素的空间
// 第二个参数表示需要在数组中插入数据的位置
// 第三个参数表示需要插入的元素
bool InsertList(SqList &s, int index, int value)
{
    // 先对index进行判断
    if (index < 1 || index > s.length+1)
        return false;

    // 对长度进行判断,如果存入数据的长度大于最大能存储元素的个数,则需要进行扩容
    if (s.length == s.max_size)
    {
        /* code */
        ExpandList(s, AddSize);
        printf("扩容成功!\n");
    }

    // 代码运行到这,表示可以进行插入元素操作
    // 将该位置的数据全部往后移一位
    for (int i = s.length; i >= index; i--)
    {
        /* code */
        s.data[i] = s.data[i - 1];
    }

    // 将value赋值给该位置上
    s.data[index - 1] = value;
    s.length++;
    return true;
}

6.在顺序表中删除数据

// 删除元素
//第一个参数表示删除元素的数组
//第二个参数表示删除元素的索引位置
//第三个参数表示返回删除的元素,可以告诉我们删了哪什么元素
bool DeleteList(SqList &s, int index, int &e)
{
    //对index进行判断
    //如果index大于数组存储的个数,失败
    if(index < 1 || index > s.length)
    {
        return false;
    }

    //代码执行到这表示可以删除元素
    //删除该位置的元素,将后面元素的数据都往前一个位置
    e = s.data[index-1];
    for (int i = index-1; i < s.length; i++)
    {
        /* code */
        s.data[i] = s.data[i+1];
    }
    s.length--;
    return true;
    
}

7.在顺序表中查找数据

查找数据分位按值查找数据,按位置查找数据

//查找值查找元素所在位置
int SearchByVal(SqList &s, int value)
{
    //遍历数据数组
    for (int i = 0; i < s.length; i++)
    {
        /* code */
        if (s.data[i] == value)
        {
            /* code */
            return i+1;
        }
        
    }
    return 0;
}
//根据位置查找值
int SearchByIndex(SqList &s, int index)
{
    if(index > s.length)
    {
        return 0;
    }

    return s.data[index-1];
    
}

最终完整代码

请点击链接或访问https://gitee.com/lanlee0216/sequential-table.git

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序表是一种线性表的存储结构,可以用数组来实现。以图书信息管理系统为例,我们可以利用一个包含图书信息的结构体数组来实现顺序表。 首先,我们需要定义一个图书的结构体,其中包含图书的名称、作者和出版社等信息。 ```c typedef struct { char name[100]; char author[100]; char publisher[100]; } Book; ``` 接下来,我们可以定义一个包含图书信息的结构体数组,并设置一个最大容量来限制图书的数量。同时,还需要定义一个变量来表示当前图书的数量。 ```c #define MAX_SIZE 100 Book bookArray[MAX_SIZE]; int bookCount = 0; ``` 然后,我们可以实现添加图书、删除图书、修改图书和查找图书等功能。 添加图书功能可以通过在数组中添加一个新元素来实现,同时更新图书数量。 ```c void addBook(Book book) { if (bookCount >= MAX_SIZE) { printf("图书数量已达上限,无法添加图书\n"); return; } bookArray[bookCount] = book; bookCount++; } ``` 删除图书功能可以通过将指定位置的元素删除,并将后面的元素依次向前移动来实现,同时更新图书数量。 ```c void deleteBook(int index) { if (index < 0 || index >= bookCount) { printf("无效的图书位置\n"); return; } for (int i = index; i < bookCount - 1; i++) { bookArray[i] = bookArray[i + 1]; } bookCount--; } ``` 修改图书功能可以通过将指定位置的元素替换为新的图书信息来实现。 ```c void modifyBook(int index, Book newBook) { if (index < 0 || index >= bookCount) { printf("无效的图书位置\n"); return; } bookArray[index] = newBook; } ``` 查找图书功能可以通过遍历数组,逐个比较图书信息来实现。 ```c void searchBook(char *name) { for (int i = 0; i < bookCount; i++) { if (strcmp(bookArray[i].name, name) == 0) { printf("找到了图书:%s\n", bookArray[i].name); return; } } printf("未找到图书:%s\n", name); } ``` 通过以上简单实现,我们可以创建一个图书信息管理系统。当然,实际的系统还可以进一步扩充功能,例如按照作者、出版社等条件进行查找和排序等。 请注意,以上代码仅为示例,可能存在一些细节或错误,并非完整的代码实现。在实际应用中,请根据实际情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值