顺序表详解
顺序表存储逻辑关系为“一对一”的顺序。在存储数据之前,要提前申请好一块足够大小的物理空间。
顺序表初始化
使用顺序表存储数据之前,除了要申请足够大小的物理空间之外,为了方便后期使用表中的数据,顺序表还需要实时记录以下 2 项数据:
1、顺序表申请的存储容量;
2、顺序表的长度,也就是表中存储数据元素的个数;
因此我们要自定义顺序表,C语言代码如下:
typedef int ElemType;
typedef struct seqlist {
ElemType *elem; //声明了一个大小不确定的数组,也成为“动态数组”
int length; //记录顺序表数据当前大小
}seqlist;
申请空间的大小我们用一个宏定义
#define MAXSIZE 10 //对MAXSIZE进行宏定义,表示顺序表申请空间的大小
#define FALSE 0 //后续会用到,不必理解
#define TRUE 1 //后续会用到,不必理解
typedef unsigned char boolean;
下面就是初始化顺序表初始化
boolean initList(seqlist* List1) {
//返回值为boolean类型的一个函数
List1->elem = (int*)malloc(MAXSIZE * sizeof(int)); //构造一个空的顺序表,动态申请存储空间
if (!List1->elem) {
//如果申请失败,作出提示并直接退出程序
printf("初始化失败");
return FALSE; //前面进行的宏定义,符合返回值类型,看起来会很方便
}
List1->length = 0;//空表的长度初始化为0
return TRUE;
}
上面是初始化顺序表,对顺序表进行空间的申请
下面是对顺序表的处理
顺序表插入元素
通过遍历顺序表,找到数据插入位置,然后做下面两步
- 将要插入元素位置后面的所有元素整体往后移动
- 讲元素放入位置
例如在{1,2,3,4,5}顺序表中,在4的位置插入元素6,只需将5,6往后移动,然后将6,放在4的位置。
//插入函数,其中,elem为插入的元素,add为插入到顺序表的位置
seqlist addseqlist(seqlist t,int elem,int add)
{
//判断插入本身是否存在问题(如果插入元素位置比整张表的长度+1还大(如果相等,是尾随的情况),或者插入的位置本身不存在,程序作为提示并自动退出)
if (add > seqlist.length + 1||add < 1) {
printf("插入位置有问题");
return seqlist;
}
//插入操作,需要将从插入位置开始的后续元素,逐个后移
for (int i = seqlist.length - 1; i >= add - 1; i--) {
seqlist.elem[i+1]=seqlist.elem[i];
}
//后移完成后,直接将所需插入元素,添加到顺序表的相应位置
seqlist.elem[add-1]=elem;
//由于添加了元素,所以长度+1
seqlist.length++;
return seqlist;
}
以上就实现了顺序表插入元素,一定要记住,插入元素后,顺序表长度要加一。
输出元素
将顺序表中的元素遍历输出
void showelem(const seqlist *List1) {
int i;
for (i = 0; i < List1->length; i++) {
printf("%d ", List1->elem[i]);
}
printf("\n");
}
顺序表删除一段元素
将顺序表要删除这段元素的后面元素往前挪动,即覆盖掉删除的元素。删除一个元素,那就让i,j的值相同。
boolean DeleteList(seqlist *List1, int i, int j) {
if (i < 0 || j < 0 || i > MAXSIZE || j >= MAXSIZE) {
printf("删除区域有误!\n");
return FALSE;
}
for (j; j < MAXSIZE; j++) {
List1->elem[i - 1] = List1->elem[j]; //将被删除这段元素的下一个元素,挪动到删除的第一个元素处,以此类推
i++;
}
List1->length = MAXSIZE - (j - i) - 1; //删除元素后长度的大小
showelem(List1); //遍历输出删除后的元素
return TRUE;
}
顺序表元素的查找
//查找函数,其中,elem表示要查找的数据元素的值
int selectTable(seqlist List1,int elem){
for (int i=0; i<List1.length; i++) {
if (List1.elem[i]==elem) {
return i+1; //下表为i,元素所在位置为i+1
}
}
return -1;//如果查找失败,返回-1
}
顺序表更改元素
顺序表更改元素的实现过程为:
- 找到要更改元素;
- 直接修改该元素的值。
代码实现如下:
//更改函数,其中,elem为要更改的元素,newElem为新的数据元素
seqlist amendTable(seqlist List1,int elem,int newElem){
int add=selectTable(List1, elem); //调用查找元素函数
List1.elem[add-1]=newElem; //返回的是元素在顺序表中的位置,所以-1就是该元素在数组中的下标
return List1;
}
线性表的基本操作到此结束。如有疑问请戳头像联系。