线性表是一种数据结构。在逻辑上,具有除了第一个结点,其他结点有唯一前驱,除了最后一个结点,其他结点有唯一后驱的特点。顺序表和链式表是线性表的两种实现方式,它们只在存储方式上有区别,在逻辑上是一致的。
区别在于顺序表示使用连续的一段空间来存储,我们常用的数组就是线性表的一种顺序表示。
数组是静态分配内存的顺序表,静态分配内存导致数组的大小是固定的,一旦数据超过数组大小,将会导致数据的溢出。这是我们不想要的,因此还有动态分配内存的方式。动态分配内存可以防止数据溢出和空间的浪费。
此文在c++环境下编写,其实除了输入输出用到c++的函数,其他完全是c语言。
模拟了动态数组的初始化,插入,输出等操作,插入元素的平均时间复杂度o(n),删除元素的平均时间复杂度o(n),按值查找的平均时间复杂度o(n),按位查找的平均时间复杂度o(1)。
目录
初始化
typedef int datatype;
struct Array{
datatype *fData;//第一个元素的地址
int max_size;//动态数组的最大长度
int length;//动态数组的有效长度
};
void init(struct Array *arr,int maxsize){
arr->fData = (datatype*)malloc(sizeof(datatype)*maxsize);//申请空间
if(arr->fData==NULL){
cout<<"空间分配失败"<<endl;
}
else {
arr->max_size=maxsize;
arr->length=0;
}
}
判断数组是否为空 or 是否已满
bool isFull(struct Array *arr){
if(arr->length>arr->max_size){
return true;
}
else return false;
}
bool isEmpty(struct Array *arr){
if(arr->length==0){
return true;
}
else return false;
}
尾部添加元素
/*
数组已满不能添加返回false,否则在尾部增加元素并返回true
*/
bool appendVal(datatype newone,struct Array *arr){
if(isFull(arr)){
return false;
}
else {
*(arr->fData+arr->length)=newone;
arr->length++;
return true;
}
}
插入元素
函数的参数posi意味着新的元素添加到第posi个元素前。
/*
数组已满无法插入返回false
否则插入元素到第posi个前,并返回true
*/
bool insertVal(datatype newone,int posi,struct Array *arr){
if(isFull((arr))){
return false;
}
else {
for(int i=arr->length-1;i>=posi-1;i--){
*(arr->fData+i+1)=*(arr->fData+i);
}
*(arr->fData+posi-1)=newone;
arr->length++;
return true;
}
}
按位查找
返回第posi位的元素值
//按位查找
datatype searchOrder(int posi,struct Array arr){
return *(arr.fData+posi-1);
}
按值查找
按值查找,返回出现该值的第一个位置,没有找到返回-1
//按值查找
int searchVal(datatype value,struct Array arr){
int i;
for(i=0;i<arr.length;i++){
if(*(arr.fData+i)==value){
cout<<"7777"<<*(arr.fData)<<"&&&"<<endl;
return i+1;
}
}
if(i>=arr.length)return -1;
}
删除元素
//删除第posi位的元素
bool deleOrder(int posi,struct Array *arr){
if(arr->length<posi){
return false;
}
else {
for(int i=posi;i<arr->length;i++){
*(arr->fData+i-1)=*(arr->fData+i);
}
arr->length--;
return true;
}
}
求表长
//求表长
int length(struct Array arr){
return arr.length;
}
打印数组
void print(struct Array *arr){
if(isEmpty(arr)){
cout<<"数组为空!"<<endl;
}
else {
for(int i=0;i<arr->length;i++){
cout<<*(arr->fData+i)<<" ";
}
cout<<endl;
}
}