顺序表的操作(动态)
静态定义一个顺序表,是通过数组来定义, 顺序表所占的内存空间开辟在内存的栈上, 随着函数调用的结束, 这块内存区域会被系统自动回收;
而动态定义顺序表, 顺序表所占的内存空间开辟在内存的堆上, 这块区域不会随着函数调用的结束被系统自动回收, 而是需要程序员自己去释放它。
顺序表的基本操作
1.顺序表的结构
typedef struct SeqList //SeqList可以省略
{
ElemType elem*;//存储空间的基址,即开辟的动态数组的首地址
int length;//有效数字的个数,顺序表当前存储元素的个数;
int ListSize;//用来定义开辟空间的容量
}SeqList; //这里的SeqList相当于 struct SeqList 即可以通过SeqList L;直接声明顺序表变量
2.顺序表的初始化
void InitList(SeqList *L)
{
L->elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));//分配空间,即最大的元素数量乘以每个元素占的字节数。最后把指针类型强制转换位该元素类型的。
if(!L->elem)//内存分配失败会返回NULL
exit(OVERFLOW);//直接结束进程超量溢出,给系统返回错误代码-2
L->length=0; //把顺序表的长度设置为0
L->ListSize=MAXSIZE;//把当前顺序表的最大容量设置为MAXSIZE
}
3.顺序表的长度
int ListLength(SeqList L)
{
return L.length;//返回线性表的的长度
}
4.判断顺序表是否为空
//判断线性表是否为空
int ListEmpty(SeqList L)
{
if(L.length==0)//如果长度为0,返回1
return 1;
return 0;//默认非空,返回0;
}
5.打印出线性表的所有元素
//打印出线性表所有的元素
void PrintList(SeqList L)
{
if(IsEmpty(L))
printf("该顺序表为空表!\n");
else
for( int i=0; i<ListLength(L); i++)
{
printf("%d ",*(L.elem+i));
}
}
6.向顺序表的指定位置插入元素
int InsertList(SeqList *L,int pos,ElemType e)//pos 插入的位置 e 插入的元素
{
int j;//作为循环变量
//先判断插入的位置是否合法
if(pos<1||pos>L->length+1)
{
printf("插入位置不合法!\n");
return ERROR;
}
//判断所剩空间是否充足,如果已满则需扩充空间
else if(L->length==L->ListSize)
{
ElemType *temp;//建立一个指针存储返回的新的起始地址
temp=realloc(L->elem,(L->ListSize+LISTCREMENT)*sizeof(ElemType));//realloc为更改存储空间大小的函数
//判断是否分配内存成功
if(!temp)
{
printf("分配内存失败!\n");
exit(OVERFLOW);
}
else
{
L->elem=temp;
L->ListSize+=LISTCREMENT;
}
}
//从最后一个元素开始,向右平移一个单位,直到要插入的元素空出来
else
{
for(j=L->length; j>=pos; j--)
*(L->elem+j)=*(L->elem+j-1);//让后一个元素等与前一个元素
*(L->elem+pos-1)=e;
L->length++;//表长加一
}
return OK;
}
7.删除顺序表指定位置的元素
int DeleteList(SeqList *L,int pos,ElemType *e)//用e来保存删除位置的元素
{
int i;//循环变量
//判断删除的位置是否合理
if(L->length==0)
{
printf("线性表是空表,不能进行删除!\n");
return 0;
}
else if(pos<1||pos>L->length)
{
printf("删除位置不合理\n");
return ERROR;
}
//从要删除的位置的右边开始,元素左移
else
{
for(i=pos; i<L->length; i++)
*(L->elem+i-1)=*(L->elem+i);
L->length=L->length-1;
}
return OK;
}
8.摧毁顺序表
int DestroyList(SeqList *L)
{
free(L->elem);
L->elem=0;//空指针
L