线性表的顺序存储必须占用一片连续的存储空间,知道一个元素的位置即知道下一个元素的位置。
顺序表特点:
(1)以物理位置相邻表示逻辑关系
(2)任一元素均可随机存取
用一维数组来表示顺序表。
线性表长可变(删除),数组长度不可动态定义->用一变量表示顺序表的长度属性
如下模板
数组静态分配:大小已定
#define LIST_INT_SIZE 100 //线性表存储空间的初始分配量
typedef struct {
ElemType elem[LIST_INIT_SIZE];//一个数组,数组静态分配
int length; //当前长度
}SqList;
数组动态分配:大小不定,后面要用函数来分配空间
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef struct {
ElemType* elem; //存储空间的基地址,数组动态分配,大小不定
int length; //当前长度
}SqList; //顺序表的结构类型为SqList
!一个存的是这个数组的首地址,一个存的就是这个数组
!ElemType是什么类型就修改为什么类型
模板应用
eg1多项式
#define MAXSIZE 1000 //多形式可能达到的最大长度
typedef struct { //多项式非0项的定义
float p; //系数
int e; //指数
}Polynomial;
typedef struct {
Polynomial* elem; //存储空间的基地址
int length; //多项式中当前项的个数
}SqList; //多项式的顺序存储结构类型为SqList
!typedef char ElemType,typedef int ElemType 两种类型,所以先定义Polynomial来存储两种数据类型
eg2图书表
#define MAXSIZE 10000 //图书表可能达到的最大长度
typedef struct { //图书信息定义
char no[20]; //图书ISBN
char name[50]; //图书名字
float price; //图书价格
}Book;
typedef struct {
Book* elem; //存储空间的基地址
int length; //图书表中当前图书个数
}SqList; //图书表的顺序存储结构类型为SqList
显示数据项(书名价格ISBN)构成数据元素(每一本书),然后是数据元素(每一本书)构成数据表(图书表)。
PS:补充
c语言的动态存储分配
(ElemType)强制类型转换,将后面的int转换成ElemType
C++的动态存储分配
int* p1 = new int;
int* p1 = new int(10);
delete p1;
!影不影响实参是指a=3被不被改变 ,交换的是a=3(值传递)还是单纯的3(地址传递)
值传递:形参变化不改变实参
#include<iostream>
using namespace std;
void swap(float m, float n) {
float temp;
temp = m;
m = n;
n = temp;
}
void main() {
float a, b;
cin >> a >> b;
swap(a, b);
cout << a << endl << b << endl;
}
地址传递:
//形参变化改变实参
#include<iostream>
using namespace std;
void swap(float* m, float* n) {
float t;
t = *m; //*m,m指向的内容
*m = *n;
*n = t;
}
void main() {
float a, b, * p1, * p2;
cin >> a >> b;
p1 = &a; p2 = &b;//p1p2存储的是a,b的地址
swap(p1, p2);//将指针作为参数传递
cout << a << endl << b << endl;
}
//形参变化不改变实参
#include<iostream>
using namespace std;
void swap(float* m, float* n) {
float* t;
t = m;
m = n;
n = t;
}
void main() {
float a, b, * p1, * p2;
cin >> a >> b;
p1 = &a; p2 = &b;
swap(p1, p2);
cout << a << endl << b << endl;
}
//数组名做参数传递的是数组的首地址
//形参改变影响实参
#include<iostream>
using namespace std;
void sub(char b[]) {//传递的是数组的首地址,[]内不能写东西
b[] = "world";
}
void main() {
char a[10] = "hello";
sub(a);
cout << a << endl;
}
引用类型直接操作实参跟地址传递一样
//引用类型做参数
#include<iostream>
using namespace std;
void swap(float& m, float& n) {
float temp;
temp = m;
m = n;
n = temp;
}
void main() {
float a, b;
cout << a << endl << b << endl;
}