线性表
零个或多个数据元素的有限序列;可以理解为数据按照顺序依次排列,除了头结点和尾结点外其他结点只存在唯一的前继和后继; 例如:平时购票的队伍、从北京到上海的京沪线等;
线性表的顺序存储结构
#define MAXSIEZ 20
typedef int ElemType;
typedef struct {
ElemType data[MAXSIEZ];
int length;
}SqList;
线性表的顺序存储结构包含两部分,一个是存储数据的数组,一个实际存储数据元素个数的整型变量;其中MAXSIEZ是该线性表指定的最大存储容量!
在线性表中获取指定位置的元素
int getElem(SqList list,int index,ElemType* e){
if (list.length==0 || index<1 ||index>list.length) {
return 0;
}else{
*e = list.data[index];
return 1;
}
}
在线性表中获取指定位置的元素,其操作实质是在SqList的data数组中返回指定索引的值;操作中应该避免数组操作引发越界的操作;数组的下标是从0开始的,而线性表的顺序存储是从1开始
在线性表中指定位置插入数据
int listInsert(SqList *list,int index,ElemType e){
if (index>list->length+1||index<1) {
return 0;
}else{
if (index == list->length+1) {
list->data[index-1] = e;
return 1;
}else{
int lastIndex = list->length;
for (int i = lastIndex; i>=index; i--) {
list->data[i] = list->data[i-1];
}
list->data[index-1] = e ;
list->length++; //元素插入完毕后增加list的长度
return 1;
}
}
}
插入操作就是将存储在指定位置后面的所有元素依次向后移动一位;然后指定位置的数据更新为传入的参数,最后将线性表的长度+1;
在线性表中指定位置删除数据
int listDelete(SqList *list,int index,ElemType* e){
if (list->length==0||index<1||index>list->length) {
return 0;
}
*e = list->data[index-1];
for (int i = index; i<list->length; i++) {
list->data[i-1] = list->data[i];
}
list->length--;
return 1;
}
在线性表中指定位置删除数据就是将存储在指定位置后面的所有元素依次向前移动一位,最后将线性表的长度+1;
SqList *list 与 SqList list
- SqList *list 表示声明一个SqList类型的指针,该指针目前未指向任何内存区域,所以是一个野指针;
- SqList list 表示声明了一个SqList类型的变量,在内存中已经开辟了相应的空间;
- 为什么查找操作的时候传入的是list变量而删除和插入传入的是list指针,主要原因首先是结构体是值类型,查找操作传入list变量,在查找函数中存放的其实是list的一个值拷贝;插入和删除操作则要对传入的list做变更操作,所以要传入list指针;
关于值类型和引用类型的区分可以考虑 swap(int a,int b);和 swap(int* a,int* b);的区别
网友评论