实现了动态分配存储空间的顺序表的初始化、创建、插入和删除操作。首先定义了存储顺序表的结构体SeqList,并初始化了存储空间、长度和分配大小。接下来定义了初始化顺序表的函数Init_SeqList,创建顺序表的函数create_SeqList,插入元素的函数insert_SeqList和删除元素的函数delete_SeqList。
在create_SeqList函数中,如果需要插入的元素数量超过了当前分配的存储空间大小,会进行扩容。然后根据输入的元素个数依次将元素插入到顺序表中。
在insert_SeqList函数中,首先判断插入位置是否合法,并进行空间扩容。然后将插入位置之后的元素依次往后移动,将要插入的元素放入对应位置。
在delete_SeqList函数中,首先判断删除位置是否合法,然后将要删除的元素保存起来。接着将删除位置之后的元素往前移动,长度减一。
1. 初始化顺序表函数Init_SeqList:
这个函数的作用是初始化一个顺序表。传入参数为SeqList类型的引用L。函数首先动态分配了一个大小为InitSize的存储空间,并将其基地址赋给L.data。然后将长度L.length置为0,表示当前顺序表中没有元素。最后将分配的存储空间大小L.listsize设为InitSize。
2. 创建顺序表函数create_SeqList:
这个函数的作用是在已有的顺序表基础上创建一个新的顺序表。传入参数为SeqList类型的引用L和要创建的元素个数n。函数首先判断如果要插入的元素个数大于当前存储空间大小L.listsize,就对存储空间进行扩容。然后根据输入的元素个数n,依次读取用户输入的元素并存储到顺序表中,同时更新顺序表长度L.length。函数返回1表示创建成功,返回0表示创建失败。
3. 插入元素函数insert_SeqList:
这个函数的作用是在顺序表的第k个位置插入一个元素elem。传入参数为SeqList类型的引用L,插入位置k和要插入的元素elem。函数首先判断插入位置k是否合法,然后再判断如果当前存储空间不足,对存储空间进行扩容。然后将插入位置之后的元素依次往后移动一位,将要插入的元素elem放入对应位置。最后更新顺序表长度L.length并返回1表示插入成功,返回0表示插入失败。
4. 删除元素函数delete_SeqList:
这个函数的作用是删除顺序表中第k个位置的元素,并将其值保存在引用参数elem中。传入参数为SeqList类型的引用L,删除位置k和一个整型引用elem。函数首先判断删除位置k是否合法,然后将要删除的元素值保存在elem中。接着将删除位置之后的元素依次往前移动一位,更新顺序表长度L.length并返回1表示删除成功,返回0表示删除失败。
在主函数main中,还没有实现具体的操作逻辑,可以在主函数中调用这些函数来操作顺序表。
#include<iostream>
using namespace std;
/**
* 动态分配存储空间
*/
#define InitSize 100 //动态分配存储空间时,不限制最大,只给定一个初始值
#define ListIncrement 10 //分配增量
typedef struct
{
int* data; //指向所分配的存储空间的基地址
int length; //当前的长度,已经存储元素后占用的长度
int listsize; //当前分配的存储空间的大小,若不足,可再进行分配
}SeqList;
//初始化线性表
/**
* 初始化顺序表,动态分配存储空间
* @param L 顺序表L,引用型
*/
void Init_SeqList(SeqList& L) {
L.data = (int*)malloc(sizeof(int) * InitSize);
L.length = 0;
L.listsize = InitSize;
}
//创建顺序表
int create_SeqList(SeqList& L, int n) {
if (n > L.listsize) {
int* newbase = (int*)realloc(L.data, sizeof(int) * (L.listsize + ListIncrement));
if (newbase) {
L.data = newbase;
L.listsize += ListIncrement;
}
else {
return 0;
}
}
for (int i = 0; i < n; i++) {
scanf("%d", &L.data[i]);
L.length = n;
return 1;
}
}
int insert_SeqList(SeqList& L, int k, int elem) {
if (k <= 1 || k > L.length) {
return 0;
}
if (L.length > L.listsize) {
int* newbase = (int*)realloc(L.data, sizeof(int) * (L.length + ListIncrement));
if (newbase) {
L.data = newbase;
L.length += ListIncrement;
}
}
for (int i = L.length; i >= k ; i--) {
L.data[i] = L.data[i - 1];
}
L.data[k - 1] = elem;
L.length++;
return 1;
}
//删除元素
int delete_SeqList(SeqList& L, int k, int& elem) {
if (k <= 1 || k > L.length) {
return 0;
}
elem = L.data[k - 1];
for (int i = k; i <= L.length; i++) {
L.data[i-1] = L.data[i];
}
L.length--;
return 1;
}
int main() {
return 0;
}