1.静态顺序表
#include<stdlib.h>
#define MaxSize 10
//声明
typedef struct{
int data[MaxSize];
int length;
}Sqlist;
//初始化
void InistList(Sqlist &L){
for(int i = 0;i<MaxSize;i++)
L.data[i] = 0;
L.length = 0;
}
int main(){
Sqlist L;
InistList(L);
return 0;
}
2.1动态顺序表
错误点:MaxSize宏定义过不需要再次声明
#include<stdlib.h>
#define MaxSize 50 //定义好之后不需要在声明里面再次声明
typedef struct{
int *Data;
int length;
}SqeList;
void InistList(SqeList &L){
L.Data = (int*)malloc(sizeof(int) * MaxSize);
for(int i = 0; i < MaxSize;i++)
L.Data[i] = 0;
L.length = MaxSize;
}
int main(){
SqeList L;
InistList(L);
return 0;
}
2.2动态顺序表加长表
错误点:void IncreaseList(SqeList &L, int len) 中要带&L,才能返回到主函数里面
在增加表长的过程中,首先将原来的数据放到p里面去,再开辟一个新的地方,再将p里面的东西放到新的地方。
#include<stdlib.h>
#include <cstdio>
#define MaxSize 50 //定义好之后不需要在声明里面再次声明
typedef struct{
int *Data;
int length;
}SqeList;
void InistList(SqeList &L){
L.Data = (int*)malloc(sizeof(int) * MaxSize);
for(int i = 0; i < MaxSize;i++)
L.Data[i] = 0;
L.length = MaxSize;
}
void IncreaseList(SqeList &L, int len){
int *p = L.Data;
L.Data = (int *)malloc(sizeof(int) * (MaxSize + len));
for(int i = 0; i<MaxSize+len;i++)
L.Data[i] = p[i];
L.length = MaxSize + len;
free(p);
}
int main(){
SqeList L;
InistList(L);
IncreaseList(L,3);
printf("顺序表的长度为:%d\n", L.length);
return 0;
}
首先在外面开辟指针p,在原来的表上,再开辟一个+len的空间,通过指针p将内容复制到新的空间去,再通过free(p),去掉p的同时将p所指的原开辟空间去掉。
3.顺序表查询
//顺序表的查找(用i查找e)
bool SearchList(SqeList &L,int i){
//增加健壮性
if(i<0 || i > L.length)
return false;
return true;
}
//顺序表的查找(用e查找i) 结构类型无法比较
bool LocalList(SqeList &L, int e){
for(int j = 0; j< L.length;j++){
if(L.Data[j] == e)
return j+1;
}
return false;
}
注意点:动态查询和静态查询的区别
在代码的形式上没有什么区别,内部操作有区别。
如果是int 类型的指针,申请的是4个空间往后,如果是ElemType类型,申请6个空间往后,跟malloc申请空间形成了闭环。
结构类型无法比较,需要将结构内部的每一个都要进行比较
4.顺序表的插入
在i之后的往后移一位,保证i能插入新元素
//顺序表的插入
bool InsertList(SqeList &L, int i, int e){
//增加健壮性(不能乱插入)
if(i < 0 || i > L.length)
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;
}
5.顺序表的删除
//顺序表的删除
bool LocalList(SqeList &L, int i,int &e){
if(i < 0 || i > L.length)
return false;
e = L.Data[i-1];
for(int j = i; j < L.length; j++)
L.Data[j-1] = L.Data[j];
L.length--;
return true;
}
int main(){
SqeList L;
InistList(L);
IncreaseList(L,3);
int e = -1;
printf("顺序表的长度为:%d\n", L.length);
return 0;
}
6.复杂度的计算