情况说明:
- 这是对于本科数据结构重新学习,代码参考本科所学的严蔚敏的数据结构和github(https://github.com/kangjianwei/Data-Structure)上一位牛人的代码进行学习。
- 需要说明:那位牛人的宏定义方面和课本风格一致,宏定义方面特别严谨,而本系列的代码均是在理解人家代码基础上,配合课本完成简化版,可以运行的代码。
顺序表初始化:
//主要代码
//使用结构体对顺序表进行表示
typedef struct {
int * elem;//这是指向这个结构体的指针变量
int length;//这是顺序表的长度
int listsize;//这是顺序表当前分配的大小,比如书里面给的100大小的空间
}SqList;
//顺序表初始化
void InitList_Sq(SqList *L){
//首先需要动态分配一个地址
//注意这个函数参数的位置,这里可以写成SqList *L,下面必须写成L->elem或者(*L).elem,
//如果是Sqlist &L 下面写的形式是L.elem(*L 表示的是指针,而&L是引用,说人话就是二者都可以
// 指向这个顺序表,&L可以理解为一个别名而已。先这样理解吧)
L->elem = (int *) malloc(LIST_INIT_SIZE*sizeof(int));
if(!(L->elem)){
return;
}
L->length=0;
L->listsize=LIST_INIT_SIZE;
}
int main() {
SqList L;
printf("开始初始化这个顺序表...\n");
{
InitList_Sq(&L);//&L,这里是作为实参,而*L往往作为一种形参
printf("初始化完毕...\n");
}
return 0;
}
return 0加断点内存测试结果如下:
可以发现结构体的初始内存地址、长度、初始分配空间大小均已经分配好。
顺序表销毁
//销毁顺序表
void DestroyList(SqList *L){
//首先释放地址空间
free(L->elem);
L->elem=NULL;//指针指向空
L->length=0;//长度均变成0
L->listsize=0;
}
printf("开始销毁这个顺序表...\n");
{
DestroyList(&L);
printf("初始化完毕...\n");//这里是销毁之后断点,变成NULL 0 0
}
内存如图所示:
添加元素
//某个位置插入一个数
void ListInsert_Sq(SqList *L,int i,int e){
//在顺序表1-n的i位置之前插入一个数e
int *newbase,*p,*q;
if(i<1||i>(L->length)+1) return;
if((L->length)>=(L->listsize)){
//如果插入的数据过大,超过顺序表当前大小
//需要重新开辟空间
//这里用realloc 是表明在谁基础上再改变内存
//newbase是一个新的地址
newbase=(int *)realloc((L->elem),(L->listsize+LISTINCREMENT)*sizeof(int));
if(!newbase) return;//如果不是这个,返回
L->elem=newbase;//把这个新的地址分给elem
L->listsize+=LISTINCREMENT;//容量增加
}
//q表示数据e insert的位置
q=&(L->elem[i-1]);
for(p=&((*L).elem[(*L).length-1]);p>=q;--p)
*(p+1)=*p;//实现右移
*q =e;//这里说明一下 ( * &q)就是表示本身的数据
(*L).length++;
}
//测试
printf("开始插入元素到这个顺序表...\n");
{
for(int i=1;i<=8;i++){