线性表的顺序表示
指的是用一组地址连续的存储单元依次存储线性表的数据元素
定长顺序表
指存储的数据元素是有限个,空间长度不能修改
length
记录当前存储的数据元素个数
size
记录空间大小(最多能够存储的数据元素个数)
《可以用宏代替》
默认规定
顺序表中所有存储的数据元素从data的0号下标连续存储的
定长顺序表的结构
struct SeqList
{
ElemType data[SIZE];//记录元素大小
int length;记录元素长度
}
提供一系列操作方法
初始化
Init
插入
按位置插入
1插入,将新元素放到1位置,之前包括1位置和之后的值统一向后移动
头插
在0号位置插入
尾插
在length位置插入
可以先进行按位置插入,然后在进行头插和尾插时,可以直接调用按位置插入
按位置插入的顺序规则
1、判断链表是否为空
2、判断当前顺序表是否为满(即是否还有存储空间)
3、判断插入位置是否合法;
(POS不能小于0,POS不能大于当前的length)
4、将插入位置和其后面的值统一向后挪动一个位置
5、将插入值存储在POS位置
6、将顺序表的length + 1
按位置插入代码示例
int InsertSeqListPos(PList list, ElemType val, int pos)//(调用函数,插入值)
{
//判断list是否为空
DeterPointIsNull(list);
//判断当前是否还有位置存放数据
if (list->length==SIZE)
{
printf("SeqList is FULL,Insert fail\n");
return 0;
}
//判断pos位置是否合法
if (pos<0||pos>list->length)
{
printf("SeqList is error,Insert fail\n");
return 0;
}//在pos位置插入元素,并且将pos位置及后面元素同意向后移位
//(在实际操作中,是先统一移位再插入元素,一般是从后往前移)
for (int i = list->length; i >pos; --i)
{
list->data[i] = list->data[i - 1];
}
list->data[pos] = val;
return 1;
}
删除
1、按位置删除
int DeleteSeqListPos(PList list, int pos)
{
DeterPointIsNull(list);
if (list->length==0)
{
printf("List is Empty,Delete error \n");
return 0;
}
if (pos<0||pos>=list->length)
{
printf("Pos is error,Delete fail \n");
return 0;
}
for (int i = pos; i < list->length-1; ++i)
{
list->data[i] = list->data[i + 1];
}
list->length--;
return 1;
}
2、按值删除(考虑重复值问题)
int DeleteSeqListVal(PList list, ElemType val)
{
//先判空
DeterPointIsNull(list);
for (int i = 0; i < list->length; )
{
if (val==list->data[i])
{
DeleteSeqListPos(list, i);
continue;
}
i++;
}
return 1;
}
3、头插
4、尾插
显示
int ShowSeqList(PList list)
{
DeterPointIsNull(list);
for (int i = 0; i < list->length; i++)
{
printf("%d", list->data[i]);
}
printf("\n");
}
清空
void ClearSeqList(PList list)
{
DeterPointIsNull(list);
list->length = 0;
}
泛指
对顺序表中所有的元素执行一个操作
void TraverseSeqList(PList list, void(*Fun)(ElemType* val))
{
DeterPointIsNull(list);
for (int i = 0; i < list->length; i++)
{
Fun(&list->data[i]);
}
}