【线性表顺序表示的基本算法】
1、定义结构体
struct SeqList
{
int maxNum;//最大元素个数
int n;//顺序表的实际长度
char *element;//存储元素的数组
};
typedef struct SeqList *PSeqList;//定义结构体类型的指针
2、创建空顺序表
PSeqList CreateNullList(int m)
{
PSeqlist palist = (PSeqlist)malloc(sizeof(struct SeqList));//分配存储空间
if(palist != NULL)
{
palist->element = (char *)malloc(sizeof(char) * m);//为顺序表分配一个由参数m指定大小的数组空间
if(paliat->element)//当 palist->element 为非空时执行
{
palist->maxNum = m;
palist->n = 0;
return palist;
}
else
{
free(palist);//当 palist->element 为NULL时执行
}
}
printf("out of space");
return NULL;
}
【注:malloc() 函数】
- 用来动态地分配内存空间,其原型为:void* malloc (size_t size);
- 返回值:分配成功返回指向该内存的地址,失败则返回 NULL
- 函数的返回值类型是 void *,void并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型
3、判断顺序表是否为空
算法:只需要判断顺序表的长度是否为0即可
int IsNullSeq(PSeqList palist)
{
return (palist->n == 0);
}
4、求某元素的下标
int LocateSeq(PSeqList palist, char x)
{
int i = 0;
while(palist->elment[i] != x)//遍历表寻找值为x的元素
{
i++;
}
return i;
}
5、顺序表的插入
前插:在下标为p的元素之前插入一个元素x
算法:将下标为p及其以后的元素往后移动一个单位,再将值为x的元素插入到下标为p的位置中
边界条件:
- p的取值范围位 [0, n-1];
- 顺序表未满,即
palist->n < palist->maxNum
代码如下:
int InsertSeq(PSeqList palist, int p, char x)
{
int q;
if(palist->n < palist->maxNum)
{
if(p >= 0 && p <= palist->n - 1)
{
for(q = palist->n - 1; q >= p; q--)
{
palist->element[q+1] = palist->element[q];//满足条件时进行移位操作
}
palist->element[p] = x;//给下标为p的元素赋新值
palist->n ++;//顺序表长度加一
return 1;
}
}
return 0;
}
6、顺序表的删除
算法:顺序表的删除并不用free()方法,而是将被删除元素之后的元素都往前面挪一个即可。
边界条件:
- 顺序表不为空,即
palist->n != 0;
- 给定的下标p的范围为 [0, n-1];
代码如下:
int DeleteSeq(PSeqList palist, int p)
{
int q;
if(palist->n != 0)
{
if(p >= 0 && p <= n - 1)
{
for(q = p; q <= palist->n - 1; q++)
{
palist->element[q] = palist->element[q+1];//满足边界条件时删除
}
palist->n--;//删除元素后长度减一
return 1;
}
}
return 0;
7、顺序表的分析与总结
优点:
- 顺序表最大的优势是可以按下表随机存取任一元素
缺点:
- 顺序表最大的不足是插入和删除的时间复杂度是O(n),需要移动大量元素,效率较低
- 顺序表需要占用连续的存储空间,存储分配要先按最大的空间来分配,可能会造成空间的严重浪费。
总结:
- 对于一旦建立就不需要经常插入和删除操作的线性表,顺序表示是一种很好的选择