顺序表基本概念
顺序表是用一组连输地址实现的线性表,其优点是可以随机访问表中元素和修改指定位置元素比较简单,但插入和删除元素需要移动元素,表长扩展也比较麻烦.
顺序表基本数据结构
用数组表示
用一维数组来表示顺序表,这样实现方法较为简单但数组大小确定后无法更改难以适应表长的变化。
typedef struct{
ElenType data[MaxSize]; //用长度为MaxSize的数组来存储元素
int length; //length表示表中数据个数
}SeqList;
用指针表示
使用指针的好处是可以动态的分配线性表的长度,但使用时要注意指针越界和指针悬空的情况。
typedef struct{
ElemType *data; //定义线性表指针用以动态分配内存
int MaxSize,Length;
//MaxSize表示线性表最大长度,Length表是表内元素个数
}SeqList;
用指针的好处是可以动态的分配内存.来增加表的长度
线性表基本操作
初始化
初始化线性表,为线性表分配空间。用size记录线性表空间大小,用Length记录线性表中元素的个数。
//初始化线性表
SeqList intList(int Size){
SeqList T;
//分配空间
T.data = (ElemType*)malloc(sizeof(ElemType)*Size);
T.MaxSize = Size; //更新数组参数
T.Length = 0; //更新数组参数
return T;
}
动态分配内存
当线性表内存不足时再给线性表分配size个存贮空间,注意重定位使原来表中的元素不至于丢失。
//增加线性表长度
SeqList toLong(SeqList T){
ElemType *p = T.data;
int SizeNew = T.MaxSize+MAXSIZE;
//重新分配空间
T.data = (ElemType*)malloc(sizeof(ElemType)*SizeNew);
T.data = p; //重新定位
T.MaxSize = SizeNew; //更新参数
return T;
}
插入元素
在表尾插入元素时只需将元素添加到表的末端即可(相当于添加元素),若在表中插入元素则需要后移元素,同时当表空间不足时当掉用增加空间的函数。
//插入元素e
SeqList listInsert (SeqList T,int i,ElemType e){
int j;
if(i<1){
//输入参数小于1
printf("\n参数不合法\n");
return T;
}else{
if(i<=T.MaxSize){
if(T.Length<T.MaxSize){
if(i>T.Length){
//表未满,插入位置在表尾后
for(j=T.Length;j<i-1;j++){
T.data[j] = 0;
}
T.data[i-1] = e;
T.Length = i;