//顺序表 静态分配
#define MaxSize 10 //定义一个长度
typedef struct{
int date[MaxSize];// 定义一个数组,存放数据元素
int length; //定义一个顺序表当前长度
}Sqlist; //用Sqlist这个类型名,代替了 struct Sqlist
//初始化顺序表
void InitList(Sqlist &L){ //&L 是指有返回值的参数,即为调用这个函数之后,数据表的内容就和这个函数的一致了
for(int i=0;i<MaxSize;i++){ //赋值初始化这步可省略
L.date[i]=0;
}
L.length=0; //未存入任何值,所以顺序表的当前长度为0
}
int main(){
Sqlist L; //数据表声明
InitList(L); //调用初始化函数
for(int i=0;i<MaxSize;i++){ //这种方法错误
printf("data[%d]=%d\n",i,L.date[i]);
}
system("pause");
return 0;
}
//顺序表动态分配
#define InitSize 10 //默认最大长度
typedef struct{
int *data; //动态分配数组指针
int MaxSize; //定义个顺序表最大容量
int length; //定义个顺序表当前长度
}SeqList;
//顺序表初始化
void InitList(SeqList &L){
//用malloc申请一片连续的存储空间
L.data=(int *)malloc(sizeof(int)*InitSize);//申请10个int类型大小的空间
L.length=0;
L.MaxSize=InitSize;
}
//增加动态数组长度
void increaseList(SeqList &L,int len){
int *p=L.data; //让指针p指向顺序表的起始地址
L.data=(int *)malloc(sizeof(int)*(L.MaxSize+len)); //给data重新开辟空间
for(int i=0;i<L.length;i++){ //将原来data的值复制到开辟新空间的data中
L.data[i]=p[i];
}
L.MaxSize=L.MaxSize+len; //数据元素MaxSize也增加了len的长度
free(p); //把指针p所指向的顺序的原来的的存储空间释放
}
//调用
int main(){
SeqList L;
InitList(L);
increaseList(L,5);
system("pause");
return 0;
}
//顺序表-插入
#define MaxSize 0
typedef struct{
int data[10];
int length;
}SqList;
void InitList(SqList &L){
L.length=0;
}
//插入
bool InsertList(SqList &L,int i,int e){
if(i<1 || i>L.length+1){ //判断i的范围是否合法,L.length+1是插入到顺序表的末尾
return false;
}
if(L.length>=MaxSize){ //判断存储空间是否已经满了
return false;
}
for(int j=L.length;j>=i;i--){ //i-1之后的元素后移
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
//删除
bool ListDelete(SqList &L,int i,int &e){
if(1<i || i>L.length){
return false;
}
e=L.data[i-1];
for(int j=i;j<L.length;j++){
L.data[j-1]=L.data[j];
}
L.length--;
return false;
}
int main(){
SqList L;
InitList(L);
//调用插入
InsertList(L,2,3);
//调用删除
int e=2;
if(ListDelete(L,3,e)){
printf("已经删除第三个元素,删除的值为%d\n",e);
}else{
printf("输入的位序i不合法,删除失败!\n");
}
return 0;
}
//线性表按位查找
//静态分配
#define MaxSize 10
typedef struct{
int data[10];
int length;
}SqList;
int GetElem(SqList &L,int i){
return L.data[i-1];
}
//动态分配
#define InitSize 10
typedef struct{
int *data;
int MaxSize;
int length;
}SeqList;
int GetElem(SeqList &L,int i){
return L.data[i-1];
}*/
//线性表按值查找
//查找第一个为e的函数,按值查找返回的是其位序
#define InitSize 10
typedef struct{
int *data;
int MaxSize;
int length;
}SeqList;
int LocateElem(SeqList L,int e){
for(int i=0;i<L.length;i++){
if(L.data[i]==e){
return i+1;
}
}
return 0;
}
顺序表操作
最新推荐文章于 2024-10-20 18:34:06 发布
本文详细探讨了顺序表的两种内存管理方式,静态分配的Sqlist与动态分配的SeqList。首先介绍了静态分配的初始化和打印操作,然后转向动态分配的内存申请、扩容和元素操作。最后对比了两者的灵活性和效率。
摘要由CSDN通过智能技术生成