静态分配
数组采用静态分配时,数组的大小和空间事先已经固定,一旦空间占满,再新加入数据就会溢出,导致程序崩溃。
#include <stdio.h>
#define MaxSize 10 //定义顺序表的最大长度
//定义
typedef struct{
int data[MaxSize]; //使用数组存放数据元素
int length; //顺序表当前的长度
}SqList;
//初始化——1、将顺序表的所有数据元素初始化为0;2、将顺序表的初始长度设为0
void InitList(SqList &L){ //参数为SqList类型,需要&
for(int i=0;i<MaxSize;i++){
L.data[i]=0; //将顺序表的所有数据元素初始化为0
}
L.length=0; //将顺序表的初始长度设为0
}
//插入 ——在位置i插入元素e
bool ListInsert(SqList &L,int i,int e){
if(i<1||i>L.length+1)
return false;
if(i>=MaxSize)
return false;
for(int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1]; //最好时间复杂度为O(1),最坏和平均为O(n)
}
L.data[i-1]=e;
L.length++; //插入后表的长度+1
return true;
}
//删除——删除第i个元素
bool ListDelete(SqList &L,int i){
if(i<1||i>L.length)
return false;
for(int j=i;j<L.length;j++){
L.data[j-1]=L.data[j]; //最好时间复杂度为O(1),最坏和平均为O(n)
}
L.length--;
return true;
}
//查找——按值查找
int LocateElem(SqList L,int e){
for(int i=0;i<L.length;i++){
if(L.data[i]==e)
printf("该元素为第%d个元素",i+1);
}
return 0;
}
int main(){
SqList L; //定义
InitList(L); //初始化,此处不需要&
ListInsert(L,1,5); //在位置1插入元素5
ListInsert(L,2,6); //在位置2插入元素6
for(int i=0;i<L.length;i++){
printf("插入后的顺序表第%d个元素为:%d\n",i,L.data[i]);
}
ListDelete(L,2); //删除第2个元素
for(int i=0;i<L.length;i++){
printf("删除后的顺序表为:%d\n",L.data[i]);
}
LocateElem(L,5);
return 0;
}
动态分配
//顺序表——动态分配
#include <stdio.h>
#include <stdlib.h> //使用malloc、free的头文件
#define InitSize 10 //默认最大长度
//定义
typedef struct{
int *data; //指示动态数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SeqList;
//初始化——使用malloc函数动态申请内存
void InitList(SeqList &L){
L.data=(int *)malloc(InitSize*sizeof(int)); //使用malloc函数动态申请内存
L.length=0; //当前长度设为0
L.MaxSize=InitSize; //默认最大长度
}
//动态增加数组长度
void IncreaseList(SeqList &L,int len){
int *p=L.data; //将数组中的数据暂时存放到指针p
L.data=(int *)malloc((L.MaxSize+len)*sizeof(int)); //重新申请内存
for(int i=0;i<L.length;i++){
L.data[i]=p[i]; //复制数据
}
L.MaxSize=L.MaxSize+len;
free(p);
}
//插入
bool ListInsert(SeqList &L,int i,int e){
if(i<1||i>L.length+1)
return false;
if(i>=L.MaxSize)
return false;
for(int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
//删除
bool ListDelete(SeqList &L,int i){
if(i<1||i>L.length)
return false;
for(int j=i;j<L.length;j++){
L.data[j-1]=L.data[j];
}
L.length--;
return true;
}
//按值查找
void LocateElem(SeqList L,int e){
for(int i=0;i<L.length;i++){
if(L.data[i]==e)
printf("元素%d是第%d个元素",e,i+1);
}
}
int main(){
SeqList L;
InitList(L);
// IncreaseList(L,10); //动态增加数组长度
ListInsert(L,1,5); //在位置1插入元素5
ListInsert(L,2,6); //在位置2插入元素6
for(int i=0;i<L.length;i++){
printf("插入后的顺序表第%d个元素为:%d\n",i,L.data[i]);
}
ListDelete(L,2); //删除第2个元素
for(int i=0;i<L.length;i++){
printf("删除后的顺序表为:%d\n",L.data[i]);
}
LocateElem(L,5);
return 0;
}