针对王道课上视频讲解,自己整理的知识
0x01 C语言预备知识
1、结构体:
一种数据类型,由一批数据组合而成的结构型数据,可以类比为:一个人(数据类型)有多个属性(变量),比如身高、体重、身份证号、性别。。。我们可以把人称为一个结构体。
struct people{
int height;
int weight;
char gender;
......
};
这样,我们在声明一个叫“人”的变量的时候,可以写作:
struct people xiaoming;
通过"."可以获取相应的属性值:
xiaoming.height=180;
xiaoming.weight=70;
2、typedef关键字:
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。
typedef int ElemType;//表示将int重命名为ElemType
//也可以作用在结构体:
typedef struct {
ElemType data[MaxSize];
ElemType length;
}SqList;//可以写成typedef struct {.....} SqList;表示将结构体struct SqList重命名为SqList
3、结构体指针:
表示一个【可以】指向结构体类型的指针
【可以】:指向一个结构体类型的指针,要求指向的数据类型必须为结构体。
例如:
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//这里的LinkList表示一个结构体指针,指向一个结构体LNode的头部。
//结构体指针也可以表示出结构体内部的数据,例如:
LinkList L;
L->data//表示L指向的结构体的data属性的值。
L->next//表示L指向结构体内部的【指向结构体的指针“next”】
0x02 静态分配存储空间的顺序表(数组)
#define MaxSize 10
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
ElemType length;
}SqList;
一、初始化一个顺序表:
1、参数中传入一个结构体L
2、通过循环,将该顺序表数据全清空为0,以便于后期进行操作
3、设置length长度为0,初始化完成。
void InitList(SqList &L){
for(int i=0;i<MaxSize;i++)
L.data[i]=0;
// L.data[i]=0;内存中含有脏数据
L.length=0;
}
二、顺序表插入操作:
对于给定的线性表L,需要将数组第i个位置之后插入元素为e:
1、判断传入的参数是否合法:位置是否正确、是否overflow
2、定义一个参数j,将j定位到要插入的位置之前一个位置将该位置之后的元素全部右移。
3、将该元素插入到其中。
bool ListInsert(SqList &L,int i,int e){
if(i<1||i>L.length+1)
return false;
if(L.length>MaxSize)
return false;
for (int j = L.length; j>=i; j--){
L.data[j]=L.data[j-1];//插入元素,
}
L.data[i-1]=e;
L.length++;
return true;
}
三、顺序表删除操作:
将给定的线性表L,删除第i个元素,将被删除的元素保存在DeleElem变量中:
1、判断传入参数是否合法:查看i所在位置是否合法。
2、定义一个变量j,将j定位到位置i上,把j的下一个元素=第j个元素(用后面的数据将前面的数据覆盖,达到另一种意义上的删除),实现删除。
3、将线性表的length–。
bool ListDelete(SqList &L,int i,int &DeleElem){
if(i<0||i>L.length-1){
return false;
}
DeleElem=L.data[i-1];
for (int j = i; j <=L.length-1; j++){
L.data[j-1]=L.data[j];//删除元素,在第i个位置删除,后面的元素就应该跑到前面去。
}
L.length--;
return true;
}
四、顺序表的查找操作:
按位查找:
由于是数组,可以直接返回位置对应的元素。
ElemType GetElem(SqList &L,int loc){//按位查找
return L.data[loc-1];
}
按值查找:
一个for循环,直接可以得出元素e对应的位置。
int LocateElem(SqList &L,ElemType e){//按值查找
for (int i = 0; i < L.length; i++)
if(L.data[i]==e)
return i+1;//返回该值索引(i)的位置(i+1)
}
0x03 动态分配存储空间的顺序表
由于静态顺序表不能够拓展空间,空间大小只能由MaxSize决定
#define InitSize 10 //顺序表初始长度
typedef int ElemType;
typedef struct{
int *data;//指动态分配数组的指针,指向顺序表第一个元素
int MaxSize;//顺序表最大容量,当前分配的存储空间的大小,若不足,可再进行分配
int length;//顺序表当前长度
}SqList;
初始化:
对于传入的L:
malloc函数可以开辟一段给定大小的空间,这里我们定义要开辟的空间大小为:sizeof(ElemType)*InitSize
sizeof()函数可以返回一个数据类型的大小,×InitSize(长度)就可以开辟出指定大小的区域。
void InitList(SqList &L){
L.data=(ElemType *)malloc(sizeof(ElemType)*InitSize);//返回新开辟的地址
L.length=0;
L.MaxSize=InitSize;
}
动态增加顺序表的长度:
1、定义一个int类型的p指针,指向L的第一个元素
2、令L的data指针指向一段开辟的新空间,与初始化同理,扩充的容量大小为(L.MaxSize+len)*sizeof(ElemType)
3、将原有的数据全部复制进去。
4、最大长度更改为新的长度。
void IncreaseSize(SqList &L,int len){//增加动态数组长度
int *p=L.data;
L.data=(ElemType *)malloc(sizeof(ElemType)*(L.MaxSize+len));//扩充容量大小
for (int i = 0; i < L.length; i++){
L.data[i]=p[i];//数据复制到新区域
}
L.MaxSize=L.MaxSize+len;//最大长度改变
free(p);
}
未完待续。。。