线性表
线性表是具有相同数据类型的n个数据元素的有限序列。
表头元素、表尾元素
线性表的特点:
- 表中元素的个数有限
- 表中元素具有逻辑上的顺序性,表中元素有其先后顺序
- 表中元素均为同一数据类型,意味着每个元素所占的存储空间大小相等。
- 表中元素都是数据元素,每个元素都是单个元素。
- 表中元素具有抽象性,即只讨论元素间的逻辑关系,而不考虑元素具体表示什么内容。
c++传递引用参数:
想让函数对参数的改变被带回来时使用。
顺序表
定义:线性表的顺序存储
位序:从1开始
在高级程序设计语言中通常用数组来描述线性表的顺序存储结构。
顺序表的实现
顺序表(存储结构)实现:静态分配,动态分配,realloc
静态分配:
int Maxsize=0;
typedef struct {
int data[Maxsize];
int length;
}Sqlist;
Sqlist s;
大小不能再改变,满了就不能再用了
动态分配:
c语言:malloc、free
c++:new data[Maxsize]、delete
int M=10;
typedef struct{
int *data;
int Maxsize;
int length;
}Sqlist;
void InitList(Sqlist &L)//初始化顺序表
{
L.Maxsize = M;
L.data = (int *)malloc(sizeof(int)*L.Maxsize);
L.length=0;//防止脏数据
}
void IncreaseList(Sqlist &L,int len)//改变顺序表大小
{
int *p = L.data;//把原来的数据先存下来,L.data会指向新的内存地址,没有新的指针原来的数据会找不到
L.data = (int *)malloc(sizeof(int)*(L.Maxsize+len));
for(int i=0;i<L.Maxsize;i++)
{
L.data[i]=p[i];
}
L.Maxsize = L.Maxsize+len;
free(p);//释放p指向的内存
}
顺序表:随机访问,存储密度高,拓展容量不方便,插入删除操作不方便。
存储密度高:相比链表来说,链表的每个节点还要存储指针,顺序表不用,所以密度高。
动态分配拓展容量需要复制,代价较大。
动态分配内存会产生脏数据,c语言自动赋值,但是有的编译器不会赋值,所以给length赋值为0.
- c语言结构体声名 struct和typedef struct 的区别
typedef struct声名结构体,在声名结构体变量时可以直接 结构体名称 变量名:
int Maxsize=0;
typedef struct {
int data[Maxsize];
int length;
}Sqlist;
Sqlist s;
struct声名结构体,声名结构体变量时需要 struct 结构体名称 变量名:
int Maxsize=10;
struct Sqlist{
int data[Maxsize];
int length;
};
struct Sqlist s;
struct结构体声名常见两种形式:
int Maxsize=10;
struct Sqlist{
int data[Maxsize];
int length;
};
struct{
int data[Maxsize];
int length;
}Sqlist;
下面这种声名方式结构体为匿名结构体,无法引用,在struct前typedef即可引用。