定义线性表的结构体
#define List_Init_Size 100
#define LIstIncrement 10//分配增量 一旦空间不足 为顺序表增加一个此长度数据元素的空间
typedef struct{
ElemType * elem;//存储空间的初始分配值 我觉得就像是数组名一样的东西
声明了一个首地址
int length;//长度是包含数据的长度
int listsize;//这个是空间分配的大小 并且以分配的存储容量(sizeof(ElemType))为单位
}Sqlist;
初始化实体线性表
Status InitList(Sqlist &L)//这是一个函数 引用了一个表 这个表应该是在主函数已经声明的 先定义再初始化
{
L.elem = (ElemType *)malloc(List_Init_Size*sizeof(ElemType));
if(!L.elem) exit(OverFlow);//创建失败 退出
L.length=0;
L.listsize=List_Init_Size;
return ok;
}
销毁线性表
status DestroyList(Sqlist &L){
free(L.list);//释放数组所有位置
L.list=NULL;//清空地址为NULL
L.length=0;
L.listsize=0;
return TRUE;
}
清空线性表
L.length=0;//只要为0 输出不出来就可以了不需要就清空地址指向的内容
Return TRUE;
指针
int *q,p;这是定义了一个指针和int变量
&
表示取地址,是取地址,你的地址可以是任何类型,
*
是指针,是取地址的内容
0️⃣int *p=&a
指的是 '&'把a变量再内存中的地址给提取出来
1️⃣*p=5
的作用
指的是 *解释了p对常量的内存地址的引用 解释的结果是直接去寻找p所指向的内容
但是因为p指向a 所以a的内容将被修改 而不是原来的内容
*也用来指代乘号
2️⃣&
➿指示 运算使用 按位与
♒取地址
♓声明一个引用
搭配*
int i=0;
int *p=&i;//p指针指向i
int **p2=&p;//p2指针指向p指针 但是 &p就代表a 所以直接使用**p就是i;
**两次解引用 因为p是指针类型变量 所以需要解两次引用才能的到0的值
**用来定义指针类型的指针
两次解引用示意
#include <iostream>
using namespace std;
//引用做参数
int main()
{
int i = 1024;
int *p = &i; // p指针指向i
int **p2 = &p; // p2指针指向p指针
cout << " i: " << i << " p: " << p << " p2: " << p2 << endl; // 分别打印 原始对象, 指针, 指针的指针
cout << " *p: " << *p << " **p2: " << **p2 << endl; // *p 解引用, **p2 两次解引用
system("pause");
return 0;
}
输出
i: 1024 p: 0x6ffe04 p2: 0x6ffdf8
*p: 1024 **p2: 1024
声明时,变量前加 "基本类型 &" :声明引用变量。它是某个已存在变量的别名,即该引用变量名称与原始变量名称都代表同一个变量。
声明时,变量前加 "基本类型 *" :声明指针变量。它的值是另一个变量的地址。
声明时,变量前加 "基本类型 **":声明二级指针变量。它的值是另一个一级"基本类型 *"指针变量的地址 (指针的指针)。
调用时,变量前加 "&" :使用取地址运算符获取该变量的地址
调用时,指针变量前加 "*" :使用间接寻址运算符获取该指针变量所指向的变量
调用时,二级指针变量前加 "**" :获取该二级指针变量所指向的指针所指向的变量
增强了语言的描述功能
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFOLW -2
typedef int Status //Status是函数类型 其值是函数结果状态代码
数据元素类型为ElemType 由用户在使用该数据类型时自行定义
一般而言 a,b,c,d,e等用作数据元素名 i,j,k,l,m,n用作整形变量名
p,q,r等等用作指针变量名 函数返回值为函数结果状态代码时 函数定义为 Status类型
为了方便算法描述 除了值调用方式外 以`&`开头的参数即为引用参数