2.4线性表的顺序表示与实现基础

线性表的顺序存储必须占用一片连续的存储空间,知道一个元素的位置即知道下一个元素的位置。

顺序表特点:

(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值